mov99 发表于 2024-7-17 08:43:22

<求助> Arduino环境编译ESP32 Dev module

操作系统Win764旗舰版,Arduino版本1.8.19,ESP32开发版本2.0.16(2.0以上一样的提示)
提示错误信息如下,求助解决方法,谢谢!

File "esptool.py", line 31, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "esptool\__init__.py", line 41, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "esptool\cmds.py", line 14, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "esptool\bin_image.py", line 14, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "esptool\loader.py", line 30, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "serial\__init__.py", line 29, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "serial\serialwin32.py", line 15, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "ctypes\__init__.py", line 7, in <module>
ImportError: DLL load failed while importing _ctypes: ��������
Failed to execute script 'esptool' due to unhandled exception!
exit status 1
为开发板 ESP32 Dev Module 编译时出错

bigluo 发表于 2024-7-17 09:09:12

应该是环境没有安装好。
ESP的Python环境不正确,具体的我也不知道,ESP没用过Python编程

lemontreen 发表于 2024-7-17 09:12:06

卸载Arduino后重新安装试试

JuncoJet 发表于 2024-7-17 09:52:45

bigluo 发表于 2024-7-17 09:09
应该是环境没有安装好。
ESP的Python环境不正确,具体的我也不知道,ESP没用过Python编程

人家没有用Python,Arduino是C++

JuncoJet 发表于 2024-7-17 09:55:38

更新开发板版本试试,Arduino有个比较奇怪的问题
开发板发布的版本被官方删除后,会导致本地编译环境坏掉

JuncoJet 发表于 2024-7-17 10:10:40

看错误代码 确实可能Python问题
esptool.py 使用了ctypes库,
要不32/64 DLL问题要不32/64 Python问题,二选一

dj3365191 发表于 2024-7-17 10:35:21

这个错误通常表示Python无法加载一个动态链接库(DLL)
可能的原因包括:

缺少或损坏的Microsoft Visual C++ Redistributable。

系统环境变量配置不正确。

Python安装不完整或损坏。

mov99 发表于 2024-7-17 11:19:09

用了很久 Win732 SP1 旗舰版,一些32位老软件运行的还算稳定

最近发现了这个SDR
https://github.com/Cvarc-Xtal/ESP32-SDR-TRX/tree/main
但需要Arduino-ESP32环境支持,其中,"I2S"需ESP32-2.0以上版本且64位系统上运行
手忙脚乱的安装了 Win764 SP1 旗舰版及Arduino-ESP32环境,结果:lol

因微软已停止对Win7的维护,系统不能更新,所以,这个问题不是个案,还好,问题已解决
(1) https://github.com/streamlink/streamlink/issues/3332
(2) https://answers.microsoft.com/en-us/windows/forum/windows_7-update/how-to-obtain-and-install-windows-7-sp2/c2c7009f-3a10-4199-9c89-48e1e883051e

文件较大,不便上传,有需要的坛友请自行下载更新
校验工具

感谢版主及各位坛友的鼎力帮助!

JuncoJet 发表于 2024-7-17 11:45:08

本帖最后由 JuncoJet 于 2024-7-17 11:47 编辑

mov99 发表于 2024-7-17 11:19
用了很久 Win732 SP1 旗舰版,一些32位老软件运行的还算稳定

最近发现了这个SDR


二次变频机?
知道了收发分开了

JuncoJet 发表于 2024-7-17 11:49:30


xSemaphoreHandle xRXDSP;
xSemaphoreHandle xRXIN;
xSemaphoreHandle xRXOUT;

int * input_buffer_ptr = &input_buffer.re;

void IRAM_ATTR rx_in(void * pvParameters){
size_t readsize = 0;

while (true) {
          #ifdef DEBUG_RUN
            int rx_time = micros();
          #endif
          xSemaphoreTake(xRXIN, portMAX_DELAY);//ждем сигнала от dsp-обработчика о готвности премного буфера для приема след.партии отсчетов
          #ifdef DEBUG_RUN
            if (access_in_wait){rx_in_wait_result = micros()-rx_time;access_in_wait=false;}
            rx_time = micros();
          #endif
          //копирование ранее принятых отсчетов из старшей части рабочего буфера в младшую (50% overlap&save)
          for (int i=0;i<NUM_SAMPLE_BUF;i++){
            workbuf_in.re = workbuf_tmp.re;
            workbuf_in.im = workbuf_tmp.im;
          }
          //прием след.порции отсчетов и перенос в старшую часть рабочего буфера
          if(current_mode==RX_MODE)i2s_read(I2S_NUM_0, &input_buffer, sizeof(input_buffer), &readsize, portMAX_DELAY);
          for (int i=0; i<NUM_SAMPLE_BUF; i++) {
            workbuf_in.re = workbuf_tmp.re = (float)(input_buffer.re>>12);
            workbuf_in.im = workbuf_tmp.im = (float)(input_buffer.im>>12);
            fft_in.re = workbuf_tmp.re;//заполняем fft-буфер для панорамы и спектра
            fft_in.im = workbuf_tmp.im;
          }
          fft_for_display((float*)&fft_in);//вычислить магнитуды для спектра и "водопада" для последующего отображения
          #ifdef DEBUG_RUN
            if (access_in_run){rx_in_run_result = micros()-rx_time;access_in_run=false;}
          #endif
          if(current_mode==RX_MODE){xSemaphoreGive(xRXDSP);}//разрешаем демодуляцию и фильтрацию рабочего буфера
}
}

void IRAM_ATTR rx_out(void * pvParameters){
size_t readsize = 0;
while(true){
          #ifdef DEBUG_RUN
            int rx_time = micros();
          #endif
          xSemaphoreTake(xRXOUT, portMAX_DELAY);//ждем окончания dsp-обработки
          #ifdef DEBUG_RUN
             if (access_out_wait){rx_out_wait_result = micros()-rx_time;access_out_wait=false;}
             rx_time = micros();
          #endif
          if(!agc)agc_koeff=1.0f;//
          for (int i=0; i<NUM_SAMPLE_BUF; i++) { //переносим обработанный массив в выходной буфер с нормализацией в I2S-формат
            output_buffer.re = speak_out ? ((int)(workbuf_out.re*agc_koeff))<<12: 0;
            output_buffer.im = speak_out ? ((int)(workbuf_out.im*agc_koeff))<<12: 0;
          }
          xSemaphoreGive(xRXIN);
          if(current_mode==RX_MODE)i2s_write(I2S_NUM_0, &output_buffer, sizeof(output_buffer), &readsize, portMAX_DELAY );//вывод звука
          #ifdef DEBUG_RUN
            if (access_out_run){rx_out_run_result = micros()-rx_time;access_out_run=false;}
          #endif
}
}

uint32_t IRAM_ATTR S_metr_ssb(float* input)
{
int bins = bandwidth/(I2S_SAMPLE_RATE/NUM_SAMPLE_BUF);
int bin_start = indent/(I2S_SAMPLE_RATE/NUM_SAMPLE_BUF);
float tmp=0;
float S_metr_buf=0;
float beta=0.99f;
float alpha=(1-beta);
for (int i=bin_start*2;i<(bins+bin_start)*2;i+=2)
{
    if (input<0){tmp=-input;}else{tmp=input;}
    S_metr_buf=(S_metr_buf*beta)+(alpha*tmp);
}

int32_t level=(int32_t)(2.0f*sqrtf((S_metr_buf/bins)));
if (level<=0)level=0;
if (level>150)level=150;
return level;
}

void IRAM_ATTR get_ssb(int pos,struct COMPLEX* input){//демодуляция SSB в частотной области

          switch (rf_mode){
          case LSB: //
            for (int i=0;i<NUM_FFT_BUF/2;i++) {
                input.re = input.re;
                input.im = -input.im;
            }
            break;
          case USB: //
            for (int i=0;i<NUM_FFT_BUF/2;i++) {
                input.re = input.re;
                input.im = input.im;
            }
            break;
          }
          for (int i=NUM_FFT_BUF/2;i<NUM_FFT_BUF;i++) {//обнуляем отрицательные частоты
            input.re = input.im = 0;
          }
}

void IRAM_ATTR get_am(struct COMPLEX* input){
   for(int i=0;i<NUM_FFT_BUF/2;i++){
         input.re = input.im = sqrtf((input.re*input.re) + (input.im*input.im));
         input.re = input.im = 0;
   }
}

void IRAM_ATTR rx_dsp(void *pvParameters){
   
    while(true){
          #ifdef DEBUG_RUN
            int rx_time = micros();
          #endif
          xSemaphoreTake(xRXDSP, portMAX_DELAY);//ждем сигнала о готвности приемного буфера
          #ifdef DEBUG_RUN
            if (access_dsp_wait){rx_dsp_wait_result = micros()-rx_time;access_dsp_wait=false;}
            rx_time = micros();
          #endif
          init_filters (num_filter);
          if(rf_mode!= AM)
          {
            xtensa_cfft_f32(&cfft,(float*)&workbuf_in,0,1);
            get_ssb(pos_fft,(struct COMPLEX*)&workbuf_in);//демодуляция ssb участка спектра в позиции pos_fft
            smeter = S_metr_ssb((float*) &workbuf_in);
            xtensa_cfft_f32(&cfft,(float*)&workbuf_in,1,1);
          }
          else
          {
            get_am((struct COMPLEX*)&workbuf_in);//пока работает не должным образом
          }
          fir_f32(&fir_rx, (float*)&workbuf_in, (float*)&workbuf_out, NUM_FFT_BUF);//основной фильтр
          //разрешаем выводить звук иприем след.партии отсчетов
          #ifdef DEBUG_RUN
            if (access_dsp_run){rx_dsp_run_result = micros()-rx_time;access_dsp_run=false;}
          #endif
          if(current_mode == RX_MODE){xSemaphoreGive(xRXOUT);}
          if (smeter > old_smeter){old_smeter=smeter;}
          if(old_smeter>70)old_smeter=70;
    }
}

xSemaphoreHandle xTXDSP;
xSemaphoreHandle xTXIN;
xSemaphoreHandle xTXOUT;

void IRAM_ATTR tx_in(void * pvParameters){
size_t readsize = 0;
while(true){
    xSemaphoreTake(xTXIN, portMAX_DELAY);//ждем сигнала об окончании dsp-обработки предыдущего буфера
    if(current_mode==TX_MODE)i2s_read(I2S_NUM_0, &input_buffer, sizeof(input_buffer), &readsize, portMAX_DELAY);
   for (int i=0; i<NUM_SAMPLE_BUF; i++) { //копируем все принятые отсчеты в рабочий буфер
       workbuf_re = (float)(input_buffer.re>>12);
       workbuf_im = (float)(input_buffer.im>>12);
   }
   if(current_mode==TX_MODE)xSemaphoreGive(xTXDSP);//разрешаем dsp-обработку рабочего буфера
}
}

void IRAM_ATTR tx_out(void * pvParameters){
size_t readsize = 0;
while(true){
    xSemaphoreTake(xTXOUT, portMAX_DELAY); //ждем сигнала об окончании dsp-обработки выходного буфера
    for (int i=0; i<NUM_SAMPLE_BUF; i++) { //переносим обработанный массив в выходной буфер с нормализацией в I2S-формат
         output_buffer.re = ((int)(workbuf_re))<<12;
         output_buffer.im = ((int)(workbuf_im))<<12;
    }
    if(current_mode==TX_MODE)i2s_write(I2S_NUM_0, &output_buffer, sizeof(output_buffer), &readsize, portMAX_DELAY );//вывод звука
}
}

void IRAM_ATTR tx_dsp(void *pvParameters){
while(true){
    xSemaphoreTake(xTXDSP, portMAX_DELAY);//ждем готовности рабочего буфера

    switch(rf_mode){//формируем квадратуры (гилберт+фнч)
    case USB:
      fir_f32(&fir_90, (float*)&workbuf_re, (float*)&workbuf_re, NUM_SAMPLE_BUF);//Hilbert90
      fir_f32(&fir_00, (float*)&workbuf_im, (float*)&workbuf_im, NUM_SAMPLE_BUF);//Hilbert00
      break;
    case LSB:
      fir_f32(&fir_00, (float*)&workbuf_re, (float*)&workbuf_re, NUM_SAMPLE_BUF);//Hilbert00
      fir_f32(&fir_90, (float*)&workbuf_im, (float*)&workbuf_im, NUM_SAMPLE_BUF);//Hilbert90
      break;
    }
    if(current_mode==TX_MODE){
      xSemaphoreGive(xTXIN);//разрешаем прием следующей партии отсчетов
      xSemaphoreGive(xTXOUT); //разрешаем выводить квадратуры в смеситель
    }
}
}


这个编解码写的很清晰

JuncoJet 发表于 2024-7-17 12:00:01


这机器确实不常见
5351输出一路频率信号,然后通过HC74来分成IQ驱动
收发都用独立的复用器做混频器


USDX的做法是5351输出3路信号,IQ驱动和TX本振驱动

mov99 发表于 2024-7-17 12:05:00

本帖最后由 mov99 于 2024-7-17 12:06 编辑

JuncoJet 发表于 2024-7-17 11:49
这个编解码写的很清晰

我不懂C编程,但感觉这位俄罗斯作者写的代码"干净"

有业余爱好者试过,这款SDR用了大屏(4.3吋)显示频谱
不清楚具体原因,美中不足,代码没写完整,距实用还有大量的工作

JuncoJet 发表于 2024-7-17 15:59:41

这个74HC74好高级的样子




mov99 发表于 2024-7-18 16:21:27

JuncoJet 发表于 2024-7-17 15:59
这个74HC74好高级的样子

看来你对SDR也感兴趣,还有一款用RP2040模块做的,电路简洁,据说还不错

https://github.com/dawsonjon/PicoRX

JuncoJet 发表于 2024-7-18 16:27:55

mov99 发表于 2024-7-18 16:21
看来你对SDR也感兴趣,还有一款用RP2040模块做的,电路简洁,据说还不错

https://github.com/dawsonjo ...

2040能产生125M PWM,只是移相真不明白
理论上可以直接取缔掉si5351
我画了板子,在论证阶段

RP2040原理图、官方和合宇
http://www.crystalradio.cn/forum.php?mod=viewthread&tid=2143633&fromuid=272612
(出处: 矿石收音机论坛)
页: [1] 2
查看完整版本: <求助> Arduino环境编译ESP32 Dev module