矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2133|回复: 15

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

[复制链接]
     
发表于 2024-7-17 08:43:22 | 显示全部楼层 |阅读模式
操作系统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: &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;
[3636] Failed to execute script 'esptool' due to unhandled exception!
exit status 1
为开发板 ESP32 Dev Module 编译时出错
     
发表于 2024-7-17 09:09:12 | 显示全部楼层
应该是环境没有安装好。
ESP的Python环境不正确,具体的我也不知道,ESP没用过Python编程

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2024-7-17 09:12:06 | 显示全部楼层
卸载Arduino后重新安装试试

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

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

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

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2024-7-17 09:55:38 | 显示全部楼层
更新开发板版本试试,Arduino有个比较奇怪的问题
开发板发布的版本被官方删除后,会导致本地编译环境坏掉
微信截图_20240717095513.png
回复 支持 反对

使用道具 举报

     
发表于 2024-7-17 10:10:40 | 显示全部楼层
看错误代码 确实可能Python问题
esptool.py 使用了ctypes库,
要不32/64 DLL问题要不32/64 Python问题,二选一
回复 支持 反对

使用道具 举报

     
发表于 2024-7-17 10:35:21 | 显示全部楼层
这个错误通常表示Python无法加载一个动态链接库(DLL)
可能的原因包括:

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

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

Python安装不完整或损坏。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 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环境,结果

因微软已停止对Win7的维护,系统不能更新,所以,这个问题不是个案,还好,问题已解决
(1) https://github.com/streamlink/streamlink/issues/3332
(2) https://answers.microsoft.com/en ... 9-9c89-48e1e883051e

文件较大,不便上传,有需要的坛友请自行下载更新
校验工具 iHasher-v0.2.rar (39.91 KB, 下载次数: 19)

感谢版主及各位坛友的鼎力帮助!
回复 支持 反对

使用道具 举报

     
发表于 2024-7-17 11:45:08 | 显示全部楼层
本帖最后由 JuncoJet 于 2024-7-17 11:47 编辑
mov99 发表于 2024-7-17 11:19
用了很久 Win732 SP1 旗舰版,一些32位老软件运行的还算稳定

最近发现了这个SDR


二次变频机?
知道了收发分开了
回复 支持 反对

使用道具 举报

     
发表于 2024-7-17 11:49:30 | 显示全部楼层

  1. xSemaphoreHandle xRXDSP;
  2. xSemaphoreHandle xRXIN;
  3. xSemaphoreHandle xRXOUT;

  4. int * input_buffer_ptr = &input_buffer[NUM_SAMPLE_BUF/2].re;

  5. void IRAM_ATTR rx_in(void * pvParameters){
  6.   size_t readsize = 0;
  7.   
  8.   while (true) {
  9.           #ifdef DEBUG_RUN
  10.             int rx_time = micros();
  11.           #endif
  12.           xSemaphoreTake(xRXIN, portMAX_DELAY);//ждем сигнала от dsp-обработчика о готвности премного буфера для приема след.партии отсчетов
  13.           #ifdef DEBUG_RUN
  14.             if (access_in_wait){rx_in_wait_result = micros()-rx_time;access_in_wait=false;}
  15.             rx_time = micros();
  16.           #endif
  17.           //копирование ранее принятых отсчетов из старшей части рабочего буфера в младшую (50% overlap&save)
  18.           for (int i=0;i<NUM_SAMPLE_BUF;i++){
  19.             workbuf_in[i].re = workbuf_tmp[i].re;
  20.             workbuf_in[i].im = workbuf_tmp[i].im;
  21.           }
  22.           //прием след.порции отсчетов и перенос в старшую часть рабочего буфера
  23.           if(current_mode==RX_MODE)i2s_read(I2S_NUM_0, &input_buffer, sizeof(input_buffer), &readsize, portMAX_DELAY);
  24.           for (int i=0; i<NUM_SAMPLE_BUF; i++) {
  25.             workbuf_in[i+NUM_SAMPLE_BUF].re = workbuf_tmp[i].re = (float)(input_buffer[i].re>>12);
  26.             workbuf_in[i+NUM_SAMPLE_BUF].im = workbuf_tmp[i].im = (float)(input_buffer[i].im>>12);
  27.             fft_in[i].re = workbuf_tmp[i].re;//заполняем fft-буфер для панорамы и спектра
  28.             fft_in[i].im = workbuf_tmp[i].im;
  29.           }
  30.           fft_for_display((float*)&fft_in);//вычислить магнитуды для спектра и "водопада" для последующего отображения
  31.           #ifdef DEBUG_RUN
  32.             if (access_in_run){rx_in_run_result = micros()-rx_time;access_in_run=false;}
  33.           #endif
  34.           if(current_mode==RX_MODE){xSemaphoreGive(xRXDSP);}//разрешаем демодуляцию и фильтрацию рабочего буфера
  35.   }
  36. }

  37. void IRAM_ATTR rx_out(void * pvParameters){
  38.   size_t readsize = 0;
  39.   while(true){
  40.           #ifdef DEBUG_RUN
  41.             int rx_time = micros();
  42.           #endif
  43.           xSemaphoreTake(xRXOUT, portMAX_DELAY);//ждем окончания dsp-обработки
  44.           #ifdef DEBUG_RUN
  45.              if (access_out_wait){rx_out_wait_result = micros()-rx_time;access_out_wait=false;}
  46.              rx_time = micros();
  47.           #endif
  48.           if(!agc)agc_koeff=1.0f;//
  49.           for (int i=0; i<NUM_SAMPLE_BUF; i++) { //переносим обработанный массив в выходной буфер с нормализацией в I2S-формат
  50.             output_buffer[i].re = speak_out ? ((int)(workbuf_out[i].re*agc_koeff))<<12: 0;
  51.             output_buffer[i].im = speak_out ? ((int)(workbuf_out[i].im*agc_koeff))<<12: 0;
  52.           }
  53.           xSemaphoreGive(xRXIN);
  54.           if(current_mode==RX_MODE)i2s_write(I2S_NUM_0, &output_buffer, sizeof(output_buffer), &readsize, portMAX_DELAY );//вывод звука
  55.           #ifdef DEBUG_RUN
  56.             if (access_out_run){rx_out_run_result = micros()-rx_time;access_out_run=false;}
  57.           #endif
  58.   }
  59. }

  60. uint32_t IRAM_ATTR S_metr_ssb(float* input)
  61. {
  62. int bins = bandwidth/(I2S_SAMPLE_RATE/NUM_SAMPLE_BUF);
  63. int bin_start = indent/(I2S_SAMPLE_RATE/NUM_SAMPLE_BUF);
  64. float tmp=0;
  65. float S_metr_buf=0;
  66. float beta=0.99f;
  67. float alpha=(1-beta);
  68.   for (int i=bin_start*2;i<(bins+bin_start)*2;i+=2)
  69.   {
  70.     if (input[i]<0){tmp=-input[i];}else{tmp=input[i];}
  71.     S_metr_buf=(S_metr_buf*beta)+(alpha*tmp);
  72.   }

  73.   int32_t level=(int32_t)(2.0f*sqrtf((S_metr_buf/bins)));
  74.   if (level<=0)level=0;
  75.   if (level>150)level=150;
  76.   return level;
  77. }

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

  79.           switch (rf_mode){
  80.           case LSB: //
  81.             for (int i=0;i<NUM_FFT_BUF/2;i++) {
  82.                 input[i].re = input[pos*2-i].re;
  83.                 input[i].im = -input[pos*2-i].im;
  84.             }
  85.             break;
  86.           case USB: //
  87.             for (int i=0;i<NUM_FFT_BUF/2;i++) {
  88.                 input[i].re = input[pos*2+i].re;
  89.                 input[i].im = input[pos*2+i].im;
  90.             }
  91.             break;
  92.           }
  93.           for (int i=NUM_FFT_BUF/2;i<NUM_FFT_BUF;i++) {//обнуляем отрицательные частоты
  94.             input[i].re = input[i].im = 0;
  95.           }
  96. }

  97. void IRAM_ATTR get_am(struct COMPLEX* input){
  98.      for(int i=0;i<NUM_FFT_BUF/2;i++){
  99.            input[i].re = input[i].im = sqrtf((input[i].re*input[i].re) + (input[i].im*input[i].im));
  100.            input[i+NUM_FFT_BUF/2].re = input[i+NUM_FFT_BUF/2].im = 0;
  101.      }  
  102. }

  103. void IRAM_ATTR rx_dsp(void *pvParameters){
  104.    
  105.     while(true){
  106.           #ifdef DEBUG_RUN
  107.             int rx_time = micros();
  108.           #endif
  109.           xSemaphoreTake(xRXDSP, portMAX_DELAY);//ждем сигнала о готвности приемного буфера
  110.           #ifdef DEBUG_RUN
  111.             if (access_dsp_wait){rx_dsp_wait_result = micros()-rx_time;access_dsp_wait=false;}
  112.             rx_time = micros();
  113.           #endif
  114.           init_filters (num_filter);
  115.           if(rf_mode!= AM)
  116.           {
  117.             xtensa_cfft_f32(&cfft,(float*)&workbuf_in,0,1);
  118.             get_ssb(pos_fft,(struct COMPLEX*)&workbuf_in);//демодуляция ssb участка спектра в позиции pos_fft
  119.             smeter = S_metr_ssb((float*) &workbuf_in);
  120.             xtensa_cfft_f32(&cfft,(float*)&workbuf_in,1,1);
  121.           }
  122.           else
  123.           {
  124.             get_am((struct COMPLEX*)&workbuf_in);//пока работает не должным образом
  125.           }
  126.           fir_f32(&fir_rx, (float*)&workbuf_in, (float*)&workbuf_out, NUM_FFT_BUF);//основной фильтр
  127.           //разрешаем выводить звук и  прием след.партии отсчетов
  128.           #ifdef DEBUG_RUN
  129.             if (access_dsp_run){rx_dsp_run_result = micros()-rx_time;access_dsp_run=false;}
  130.           #endif
  131.           if(current_mode == RX_MODE){xSemaphoreGive(xRXOUT);}
  132.           if (smeter > old_smeter){old_smeter=smeter;}
  133.           if(old_smeter>70)old_smeter=70;
  134.     }
  135. }

  136. xSemaphoreHandle xTXDSP;
  137. xSemaphoreHandle xTXIN;
  138. xSemaphoreHandle xTXOUT;

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

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

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

  165.     switch(rf_mode){//формируем квадратуры (гилберт+фнч)
  166.     case USB:
  167.       fir_f32(&fir_90, (float*)&workbuf_re, (float*)&workbuf_re, NUM_SAMPLE_BUF);//Hilbert90
  168.       fir_f32(&fir_00, (float*)&workbuf_im, (float*)&workbuf_im, NUM_SAMPLE_BUF);//Hilbert00
  169.       break;
  170.     case LSB:
  171.       fir_f32(&fir_00, (float*)&workbuf_re, (float*)&workbuf_re, NUM_SAMPLE_BUF);//Hilbert00
  172.       fir_f32(&fir_90, (float*)&workbuf_im, (float*)&workbuf_im, NUM_SAMPLE_BUF);//Hilbert90
  173.       break;
  174.     }
  175.     if(current_mode==TX_MODE){
  176.         xSemaphoreGive(xTXIN);  //разрешаем прием следующей партии отсчетов
  177.         xSemaphoreGive(xTXOUT); //разрешаем выводить квадратуры в смеситель
  178.     }
  179.   }
  180. }
复制代码


这个编解码写的很清晰
回复 支持 反对

使用道具 举报

     
发表于 2024-7-17 12:00:01 | 显示全部楼层
tayloe.jpg
这机器确实不常见
5351输出一路频率信号,然后通过HC74来分成IQ驱动
收发都用独立的复用器做混频器

usdx.png
USDX的做法是5351输出3路信号,IQ驱动和TX本振驱动
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-7-17 12:05:00 | 显示全部楼层
本帖最后由 mov99 于 2024-7-17 12:06 编辑
JuncoJet 发表于 2024-7-17 11:49
这个编解码写的很清晰


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

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

使用道具 举报

     
发表于 2024-7-17 15:59:41 | 显示全部楼层
这个74HC74好高级的样子

slice_0_0.jpg
slice_1_0.jpg
slice_2_0.jpg
slice_3_0.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-7-18 16:21:27 | 显示全部楼层
JuncoJet 发表于 2024-7-17 15:59
这个74HC74好高级的样子

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

https://github.com/dawsonjon/PicoRX
回复 支持 反对

使用道具 举报

     
发表于 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 ... &fromuid=272612
(出处: 矿石收音机论坛)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-26 09:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表