216|0

219

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【Follow me第二季第4期】Arduino Nano RP2040 Connect 任务总贴 [复制链接]

  本帖最后由 meiyao 于 2025-1-13 09:34 编辑

1、视频:

nauo rp2040_哔哩哔哩_bilibili

2、全部物料清单:

开发板:ARDUINO NANO RP2040 CONNECT

 

扩展板:FollowMe2024S2P4

 

OLED:GROVE OLED YELLOW&BLUE DISPLAY

 

3、软件流程设计思路

 

 

 

 

 

 

 

 

 

必做任务一:搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!;

 

Arduino Nano RP2040 Connect的必做任务一“搭建环境并开启第一步Blink三色LED/串口打印Hello DigiKey & EEWorld!”涉及多个步骤,以下是对该任务的详细解答:

1、搭建开发环境 下载并安装Arduino IDE:

确保使用的是Arduino IDE的最新版本,以便获得最新的功能和支持。

官方连接:

https://www.arduino.cc/en/software

 

安装RP2040支持包: 打开Arduino IDE,进入“工具”>“板子”>“开发板管理器”。

 

在开发板管理器中,搜索并安装“Arduino Mbed OS RP2040”或“Arduino Nano RP2040 Connect”的支持包。

 

连接开发板: 使用USB连接线(A口to Micro)将Arduino Nano RP2040 Connect开发板连接到电脑。

在Arduino IDE中,通过“工具”>“端口”选择正确的端口。

 

 

2、Blink三色LED 了解RGB LED控制:

Arduino Nano RP2040 Connect开发板上的RGB LED是通过Wi-Fi模块Nina W102控制的,在编程时需要包含WiFiNINA库才能使用RGB LED。

编写代码: 在Arduino IDE中编写代码,以控制RGB LED的闪烁。

代码如下:

digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
delay(100); // 减少延迟时间以加快闪烁速度
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
delay(100); // 同样减少延迟时间
digitalWrite(led3, LOW);
digitalWrite(led1, HIGH);
delay(100); // 再次减少延迟时间

// 输出消息到串口,但保持延迟时间不变,以便有足够时间查看消息
Serial.println("{ Hello DigiKey & EEWorld!}");
delay(1000); // 保持1秒的延迟,以便观察消息或LED闪烁的结束
  // 慢闪10次
  for (int i = 0; i < 10; i++) {
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    delay(200); // 慢闪延迟200毫秒
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);
    delay(200);
    digitalWrite(led3, LOW);
    digitalWrite(led1, HIGH);
    delay(200);
  }
  
  // 快闪10次
  for (int i = 0; i < 10; i++) {
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    delay(50); // 快闪延迟50毫秒
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);
    delay(50);
    digitalWrite(led3, LOW);
    digitalWrite(led1, HIGH);
    delay(50);
  }
  Serial.println("Arduino® Nano RP2040 Connect");

 

3、串口打印Hello DigiKey & EEWorld!代码:

在上面的代码中添加串口打印语句。

修改后的代码如下:

  //设置串口打印后续Print
  Serial.begin(9600);


Serial.println("{ Hello DigiKey & EEWorld!}");

Serial.println("Arduino® Nano RP2040 Connect");

4、实际输出结果

15371f8679a704b0cfe8df08c64d8af4

 

 

必做任务二:学习IMU基础知识,调试IMU传感器,通过串口打印六轴原始数据;

 

Arduino Nano RP2040 Connect 惯性测量单元基础知识,调试IMU传感器,并通过串口打印六轴原始数据。

 

1、IMU基础知识 IMU(Inertial Measurement Unit)是一个由不同传感器组成的部件,用于记录特定力、角速度、方向等数据。

在Arduino Nano RP2040 Connect上,通常集成了LSM6DSOX这款6轴IMU传感器,它包含以下两个主要部分:

三轴加速度计:用于测量加速力,这种力可以是静态的(持续的重力作用力),也可以是动态的(如感知运动或振动)。

陀螺仪是通过测量科氏力来检测角速度的,科氏力在大学物理中提到过.

 

三轴陀螺仪:用于测量和保持物体的方向和角速度。陀螺仪比加速度计更先进,因为它可以测量物体的倾斜和横向方向,而加速度计只能测量其线性运动。

对姿态的描述,最直观的便是欧拉角了。实际上一个动图便能十分直观的理解.

2、调试IMU传感器 安装所需库:

打开Arduino IDE。 进入“工具”>“库管理器”。 搜索并安装“Arduino_LSM6DSOX”库。

 

连接开发板: 使用USB连接线将Arduino Nano RP2040 Connect开发板连接到电脑。

在Arduino IDE中,通过“工具”>“端口”选择正确的端口。

编写代码: 下面是一个简单的示例代码,演示如何读取加速度和陀螺仪数据,并通过串口打印输出:

 

 

 

根据上图可以看到,我通过摆动板了,就可以读到IMU传感器的数据并通过串口打印出来。

 

 

3.代码:

    // 打印加速度计X轴的数据
Serial.print("accelerated speed_X = "); // 在串行监视器上打印文本标签
Serial.print(acc_x); // 打印变量acc_x的值,它应该包含加速度计X轴的数据
Serial.print('\t'); // 打印一个制表符,用于在输出中创建水平间隔

// 打印加速度计Y轴的数据
Serial.print("accelerated speed_Y = "); // 在串行监视器上打印文本标签
Serial.print(acc_y); // 打印变量acc_y的值,它应该包含加速度计Y轴的数据
Serial.print('\t'); // 打印一个制表符

// 打印加速度计Z轴的数据
Serial.print("accelerated speed_Z = "); // 在串行监视器上打印文本标签
Serial.print(acc_z); // 打印变量acc_z的值,它应该包含加速度计Z轴的数据
Serial.print('\n'); // 打印一个换行符,以开始新的一行输出

// 打印陀螺仪X轴的数据
Serial.print("Gyro_X = "); // 在串行监视器上打印文本标签
Serial.print(gyro_x); // 打印变量gyro_x的值,它应该包含陀螺仪X轴的数据
Serial.print('\t'); // 打印一个制表符

// 打印陀螺仪Y轴的数据
Serial.print("Gyro_Y = "); // 在串行监视器上打印文本标签
Serial.print(gyro_y); // 打印变量gyro_y的值,它应该包含陀螺仪Y轴的数据
Serial.print('\t'); // 打印一个制表符

// 打印陀螺仪Z轴的数据
Serial.print("Gyro_Z = "); // 在串行监视器上打印文本标签
Serial.print(gyro_z); // 打印变量gyro_z的值,它应该包含陀螺仪Z轴的数据
Serial.print('\n'); // 打印一个换行符,以结束当前行的输出并开始新的一行

 

必做任务三:学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形。

 

1、PDM麦克风技术知识 PDM麦克风简介:

PDM麦克风是一种基于脉冲密度调制技术的麦克风,它输出的是数字信号,适合直接处理数字音频。

Arduino Nano RP2040 Connect板载了MP34DT06JTR这款PDM麦克风,它是一款超紧凑、低功耗、全向、数字MEMS麦克风。

PDM工作原理: PDM是一种调制形式,用于表示数字域中的模拟信号。它是1位数字采样的高频数据流,其中脉冲的相对密度对应于模拟信号的幅度。 大量的“1”对应于高(正)幅度值,而大量的“0”对应于低(负)幅度值,交替的“1”和“0”对应于幅度值0。

PDM麦克风的应用: PDM麦克风适用于语音识别、音频采集等场景,因为它能够直接输出数字信号,方便后续的数字音频处理。

 

PDM调制器(在PDM麦克风内)或噪声整形器(在PCM到PCM转换器内)有能力产生在通带内有着非常低噪声的1比特信号。

 

给定一个正弦波输入信号时,PDM调制器输出的时域和频域的视图。时域输出在两个电平之间以高速率切换。频域内,在xx轴上通带从00扩展到0.5fs0.5fs。在此之上是由过采样创建的频谱空间。在通带之上很容易见到猛烈的噪声上升。同样可见的是一个很小数量的三次谐波失真(峰值接近0.06fs0.06fs)。

 

MIC标准原理图:

 

TDM系统框图:

 

2、调试PDM麦克风 环境准备:

如果需要在MicroPython环境中使用PDM麦克风,需要下载并安装专门的驱动PinkInk/mp34dt06-a-micropython-driver。

代码编写与上传: 在Arduino IDE中编写代码,以初始化PDM麦克风并通过串口打印收音数据。 

输出结果:

 

点我弄出声响时,出现不一样的声音波形,会特别的高,从下图波形就可以看到。

通过串口打印音频波形 使用串口绘图器, Arduino IDE提供了串口绘图器(Serial Plotter)工具,可以用于观察音频数据的波形变化。 在上传了上述代码后,打开串口监视器旁边的串口绘图器。 调整绘图器的设置,以便能够清晰地看到音频波形的变化。

数据可视化: 在串口绘图器中,可以观察到PDM麦克风收音的音频波形。通过大声说话或发出其他声音,可以看到波形随之变化。

 

 

 

3、代码:

  delay(10);
  digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
delay(100); // 减少延迟时间以加快闪烁速度
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
delay(100); // 同样减少延迟时间
digitalWrite(led3, LOW);
digitalWrite(led1, HIGH);
delay(100); // 再次减少延迟时间

// 输出消息到串口,但保持延迟时间不变,以便有足够时间查看消息
Serial.println("{ Hello DigiKey & EEWorld!}");
delay(1000); // 保持1秒的延迟,以便观察消息或LED闪烁的结束
  // 慢闪10次
  for (int i = 0; i < 10; i++) {
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    delay(200); // 慢闪延迟200毫秒
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);
    delay(200);
    digitalWrite(led3, LOW);
    digitalWrite(led1, HIGH);
    delay(200);
  }
  
  // 快闪10次
  for (int i = 0; i < 10; i++) {
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    delay(50); // 快闪延迟50毫秒
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);
    delay(50);
    digitalWrite(led3, LOW);
    digitalWrite(led1, HIGH);
    delay(50);
  }
  Serial.println("Arduino® Nano RP2040 Connect");
}


void onPDMdata() {
  // 获取PDM缓存可读字节数
  int bytesAvailable = PDM.available();
  // 将缓存读取到Buff中
  PDM.read(sampleBuffer, bytesAvailable);
  // 16-bit, 2 bytes per sample
  samplesRead = bytesAvailable / 2;
}

 

选做任务一(非必做):通过RGB LED不同颜色、亮度显示PDM麦克风收到的声音大小;

实现步骤

初始化PDM麦克风: 在setup()函数中,初始化PDM麦克风,并设置回调函数以处理接收到的音频数据。

  Serial.begin(115200);  // 初始化串口通信
  while (!Serial);  
  // 设置LED 引脚输出
  pinMode(LEDR, OUTPUT);  
  pinMode(LEDG, OUTPUT);  
  pinMode(LEDB, OUTPUT);  
  // 配置数据回调函数
  PDM.onReceive(onPDMdata);
  if (!PDM.begin(channels, frequency)) {
    Serial.println("Failed to start PDM!");
    while (1);  // 启动失败
  }

读取音频数据: 在回调函数中,读取PDM麦克风接收到的音频数据,并存储在缓冲区中。

  if (samplesRead) {
    float rms = getRMSAmplitude(sampleBuffer, samplesRead);
    controlLEDs(rms);
    
    // 打印RMS值到串口(减缓打印速度)
    Serial.println(rms);
    delay(100); // 添加延时,单位为毫秒(这里设置为100ms)
    
    // 重置已读取的样本数量
    samplesRead = 0;

计算声音大小: 使用一种算法(如峰值振幅法、RMS振幅法等)来计算音频数据的振幅或声音大小。

映射到RGB LED: 将计算出的声音大小映射到RGB LED的颜色和亮度上。例如,可以设定低音量时红色LED亮起,中低音量时绿色LED亮起,中高音量时蓝色LED亮起,高音量时RGB全亮。

更新RGB LED: 根据映射结果,更新RGB LED的颜色和亮度。

代码示例 演示了如何通过RGB LED显示PDM麦克风收到的声音大小:

  if (rms < 500) {
    digitalWrite(LEDR, HIGH);
    digitalWrite(LEDG, LOW);
    digitalWrite(LEDB, LOW);
  } 
  // 500<rms<1500绿色LED亮起
  else if (rms < 1500) {
    digitalWrite(LEDR, LOW);
    digitalWrite(LEDG, HIGH);
    digitalWrite(LEDB, LOW);
  }
  // 1500<rms<3000蓝色LED亮起
  else if (rms < 3000) {
    digitalWrite(LEDR, LOW);
    digitalWrite(LEDG, LOW);
    digitalWrite(LEDB, HIGH);
  } 
  // rms>3000LED全亮
  else {
    digitalWrite(LEDR, HIGH);
    digitalWrite(LEDG, HIGH);
    digitalWrite(LEDB, HIGH);
  }

在串口绘图器中,可以观察到PDM麦克风收音的音频波形。通过大声说话或发出其他声音,可以看到波形随之变化。

 

串口输出值。

 

下面的图是我正常居住环境声音。

 

 

 

输出结果:

79d956517b94cd23c854881e4365ac42

 

Arduino Nano RP2040 Connect OLED

 

硬件连接:

Arduino Nano RP2040 Connect开发板、OLED显示器需支持I2CI通信协议相连接线。

连接步骤:将OLED显示器的VCC和GND分别连接到Arduino Nano RP2040 Connect的3.3V和GND引脚。 根据OLED显示器的通信协议(I2C),将相应的数据线SDA、SCL对于I2C连接到Arduino Nano RP2040 Connect的对应引脚上。 可以添加适当的电阻来限流,以保护OLED显示器和Arduino Nano RP2040 Connect的引脚。

 

软件设置: 安装库文件:在Arduino IDE中,需要安装支持OLED显示器的库文件,如Adafruit_GFX和Adafruit_SSD1306(针对常见的SSD1306驱动的OLED显示器)。

编写代码:使用Arduino IDE编写代码,初始化OLED显示器,并显示所需的内容。

代码示例如下(以I2C通信协议为例):

oid testdrawline() {
  int16_t i;

  display.clearDisplay(); // Clear display buffer

  for(i=0; i<display.width(); i+=4) {
    display.drawLine(0, 0, i, display.height()-1, SSD1306_WHITE);
    display.display(); // Update screen with each newly-drawn line
    delay(1);
  }
  for(i=0; i<display.height(); i+=4) {
    display.drawLine(0, 0, display.width()-1, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(250);

  display.clearDisplay();

  for(i=0; i<display.width(); i+=4) {
    display.drawLine(0, display.height()-1, i, 0, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  for(i=display.height()-1; i>=0; i-=4) {
    display.drawLine(0, display.height()-1, display.width()-1, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(250);

  display.clearDisplay();

  for(i=display.width()-1; i>=0; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, i, 0, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  for(i=display.height()-1; i>=0; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, 0, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(250);

  display.clearDisplay();

  for(i=0; i<display.height(); i+=4) {
    display.drawLine(display.width()-1, 0, 0, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  for(i=0; i<display.width(); i+=4) {
    display.drawLine(display.width()-1, 0, i, display.height()-1, SSD1306_WHITE);
    display.display();
    delay(1);
  }

  delay(2000); // Pause for 2 seconds
}

void testdrawrect(void) {
  display.clearDisplay();

  for(int16_t i=0; i<display.height()/2; i+=2) {
    display.drawRect(i, i, display.width()-2*i, display.height()-2*i, SSD1306_WHITE);
    display.display(); // Update screen with each newly-drawn rectangle
    delay(1);
  }

  delay(2000);
}

void testfillrect(void) {
  display.clearDisplay();

  for(int16_t i=0; i<display.height()/2; i+=3) {
    // The INVERSE color is used so rectangles alternate white/black
    display.fillRect(i, i, display.width()-i*2, display.height()-i*2, SSD1306_INVERSE);
    display.display(); // Update screen with each newly-drawn rectangle
    delay(1);
  }

  delay(2000);
}

void testdrawcircle(void) {
  display.clearDisplay();

  for(int16_t i=0; i<max(display.width(),display.height())/2; i+=2) {
    display.drawCircle(display.width()/2, display.height()/2, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }

  delay(2000);
}

void testfillcircle(void) {
  display.clearDisplay();

  for(int16_t i=max(display.width(),display.height())/2; i>0; i-=3) {
    // The INVERSE color is used so circles alternate white/black
    display.fillCircle(display.width() / 2, display.height() / 2, i, SSD1306_INVERSE);
    display.display(); // Update screen with each newly-drawn circle
    delay(1);
  }

  delay(2000);
}

void testdrawroundrect(void) {
  display.clearDisplay();

  for(int16_t i=0; i<display.height()/2-2; i+=2) {
    display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i,
      display.height()/4, SSD1306_WHITE);
    display.display();
    delay(1);
  }

  delay(2000);
}

void testfillroundrect(void) {
  display.clearDisplay();

  for(int16_t i=0; i<display.height()/2-2; i+=2) {
    // The INVERSE color is used so round-rects alternate white/black
    display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i,
      display.height()/4, SSD1306_INVERSE);
    display.display();
    delay(1);
  }

  delay(2000);
}

void testdrawtriangle(void) {
  display.clearDisplay();

  for(int16_t i=0; i<max(display.width(),display.height())/2; i+=5) {
    display.drawTriangle(
      display.width()/2  , display.height()/2-i,
      display.width()/2-i, display.height()/2+i,
      display.width()/2+i, display.height()/2+i, SSD1306_WHITE);
    display.display();
    delay(1);
  }

  delay(2000);
}

void testfilltriangle(void) {
  display.clearDisplay();

  for(int16_t i=max(display.width(),display.height())/2; i>0; i-=5) {
    // The INVERSE color is used so triangles alternate white/black
    display.fillTriangle(
      display.width()/2  , display.height()/2-i,
      display.width()/2-i, display.height()/2+i,
      display.width()/2+i, display.height()/2+i, SSD1306_INVERSE);
    display.display();
    delay(1);
  }

  delay(2000);
}

void testdrawchar(void) {
  display.clearDisplay();

  display.setTextSize(1);      // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE); // Draw white text
  display.setCursor(0, 0);     // Start at top-left corner
  display.cp437(true);         // Use full 256 char 'Code Page 437' font

  // Not all the characters will fit on the display. This is normal.
  // Library will draw what it can and the rest will be clipped.
  for(int16_t i=0; i<256; i++) {
    if(i == '\n') display.write(' ');
    else          display.write(i);
  }

  display.display();
  delay(2000);
}

void testdrawstyles(void) {
  display.clearDisplay();

  display.setTextSize(1);             // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.setCursor(0,0);             // Start at top-left corner
  display.println(F("Hello, world!"));

  display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
  display.println(3.141592);

  display.setTextSize(2);             // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.print(F("0x")); display.println(0xDEADBEEF, HEX);

  display.display();
  delay(2000);
}

void testscrolltext(void) {
  display.clearDisplay();

  display.setTextSize(2); // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10, 0);
  display.println(F("scroll"));
  display.display();      // Show initial text
  delay(100);

  // Scroll in various directions, pausing in-between:
  display.startscrollright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrolldiagright(0x00, 0x07);
  delay(2000);
  display.startscrolldiagleft(0x00, 0x07);
  delay(2000);
  display.stopscroll();
  delay(1000);
}

void testdrawbitmap(void) {
  display.clearDisplay();

  display.drawBitmap(
    (display.width()  - LOGO_WIDTH ) / 2,
    (display.height() - LOGO_HEIGHT) / 2,
    logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
  display.display();
  delay(1000);
}

#define XPOS   0 // Indexes into the 'icons' array in function below
#define YPOS   1
#define DELTAY 2

void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
  int8_t f, icons[NUMFLAKES][3];

  // Initialize 'snowflake' positions
  for(f=0; f< NUMFLAKES; f++) {
    icons[f][XPOS]   = random(1 - LOGO_WIDTH, display.width());
    icons[f][YPOS]   = -LOGO_HEIGHT;
    icons[f][DELTAY] = random(1, 6);
    Serial.print(F("x: "));
    Serial.print(icons[f][XPOS], DEC);
    Serial.print(F(" y: "));
    Serial.print(icons[f][YPOS], DEC);
    Serial.print(F(" dy: "));
    Serial.println(icons[f][DELTAY], DEC);
  }

  for(;;) { // Loop forever...
    display.clearDisplay(); // Clear the display buffer

    // Draw each snowflake:
    for(f=0; f< NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SSD1306_WHITE);
    }

    display.display(); // Show the display buffer on the screen
    delay(200);        // Pause for 1/10 second

    // Then update coordinates of each flake...
    for(f=0; f< NUMFLAKES; f++) {
      icons[f][YPOS] += icons[f][DELTAY];
      // If snowflake is off the bottom of the screen...
      if (icons[f][YPOS] >= display.height()) {
        // Reinitialize to a random position, just off the top
        icons[f][XPOS]   = random(1 - LOGO_WIDTH, display.width());
        icons[f][YPOS]   = -LOGO_HEIGHT;
        icons[f][DELTAY] = random(1, 6);
      }
    }
  }
}

 

 

驱动OLED效果:

b7255c5e4beefc1a1e7b8acb58080d60

 

 

 

心得体会:

 

在完成这些任务的过程中,我深刻体会到了理论与实践的紧密结合。从最初的搭建环境到成功点亮Blink三色LED,再到串口打印出“Hello DigiKey & EEWorld!”,每一步都让我感受到了技术实现的成就感,但是第一步都是坎坷,也是提升。

学习IMU传感器和PDM麦克风技术时,我不仅掌握了基础知识,还通过调试和串口打印数据,加深了对这些技术的理解,因为之前从来没有做过这方面的,选做任务的挑战也让我受益匪浅,整个过程充满了探索和挑战,但正是这些经历,让我对嵌入式系统和物联网技术有了更深入的认识和体会。

 


RP2040.zip (4.41 KB, 下载次数: 3)

 

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
Protel 99 SE 应用技术问答

l问:请问多层电路板是否可以用自动布线答复:可以的,跟双面板一样的,设置好就行了。问:在protel中能否用orcad原理图答复:需 ...

第五届全国大学生电子设计竞赛获奖作品选编

第五届全国大学生电子设计竞赛获奖作品选编

在现有的PCB板图上怎样加载网络标号?

大家好,请问一下,在PROTEL99SE中,我要在现成的PCB图上加网络标号,各接点加载之后,我想把已连好的线都转换过来,也就是说, ...

lpc1343之三:通过USB接口控制开发板LED闪烁速度并读取AD转换结果

一直想充分利用LP1343的USB Device接口作为初期开发时的人机接口。 如果有感兴趣的朋友可以下载原代码研究。所有程序基于:LP ...

针对beaglebone 扩展板,进行Linux驱动的调试!

好久没有发帖子了!今天来分享一下针对beaglebone 扩展板,进行Linux驱动的调试吧! 第二次修正beaglebone板子的外围电路还是比 ...

SiC(碳化硅)是什么?SiC-MOS关与Si-MOS管的区别

本帖最后由 qwqwqw2088 于 2020-3-29 11:22 编辑 碳化硅(SiC)是比较新的半导体材料。一开始,我们先来了解一下它的物理特性 ...

颁奖:10月21日ADI直播:惯性MEMS应用那些事

10月21日ADI直播:惯性MEMS应用那些事活动颁奖啦!名单详见下方列表。请获奖者务必在2020年12月6日23:59前,按照下方领奖确认流 ...

寻找可以交替发送指令且支持2400波特率的串口助手

如题,寻求帮助,需要找一个可以交替发送指令且支持2400波特率的串口助手 我手上有个可以交替发送指令的,但是偏偏不支持2400 ...

ARM编程实践入门《一步步写嵌入式操作系统——ARM编程的方法与实践》

这是一本介绍怎样去实际编写一款嵌入式操作系统的书,全书共分九章,从最基本的嵌入式编程方法开始,逐渐深入到中断管理、内存管 ...

【DigiKey创意大赛】家庭共享智能药盒01+开箱

【DigiKey创意大赛】家庭共享智能药盒01+开箱 没想到这次的创意能够入选,非常荣幸。我的创意如下: 以往的智能药盒主要是 ...

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表