色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Arduino RF 探索者機器人 —第2部分—組裝所有組件

張玉蘭 ? 來源:羅姆 ? 作者:羅姆 ? 2023-02-23 10:59 ? 次閱讀

這篇文章來源于DevicePlus.com英語網站的翻譯稿。點擊此處閱讀本文第1部分 >

poYBAGPzER6ACV2tAAGs0Hy8lDQ325.jpg

在第1部分中,我們討論了構建一個探索者機器人的幾個重要步驟。我們通過Eagle設計并創建了我們自己的PCB。在第2部分中,我們將添加其他組件,并對程序進行測試,以確保RF機器人能夠按照預期方式運行。這里我們所設計的探索者機器人能夠自主行駛,感知周圍環境并無線傳輸收集到的數據。該項目的目標是為探索者機器人制造原型,該原型將配備有一組傳感器,如溫度傳感器壓力傳感器,這些傳感器能夠借助數字無線電通信模塊(RF)實時發送所收集的信息

硬件

Arduino Uno

2x 收發器 NRF24l01+

2x Pololu 發動機 100:1

4x 車輪

穩壓器

水晶玻璃

L298

nRF24L01

氣壓傳感器 BMP085

距離傳感器 HC-SR04

軟件

Arduino IDE

C#

GitHub

工具

Eagle CAD

pYYBAGPzESaAeVWaAAGZ4dl8rz8727.jpg

圖1:第1部分中的RF機器人設置

步驟 1:結構和機械組件

遠程控制器將從筆記本電腦USB端口獲取信息,并通過第二個nRF24l01+模塊進行重定向。遠程控制器由Arduino開發板和帶有NRF連接器電源的板組成,這個板將被安裝在Uno上方,以避免使用電線。

poYBAGPzESmAXU1qAAEsk_WoP88489.jpg

圖2:遠程控制器原理圖

pYYBAGPzES2AZQy3AAFF-zTHHPM417.jpg

圖3:遠程控制器PCB

poYBAGPzETCAW2HZAAGD76BvPMw855.jpg

圖4:安裝有連接到Arduino Uno 的NRF24L01+模塊的遠程控制器

您還會看到我們安裝的兩個LED燈,用來指示電路的功能和上述的其他組件。我們將會使用一些用于穩壓器和NPN晶體管過熱保護的小冷卻器。電路板將會被放置于電池上方,如圖5所示。

poYBAGPzETKAS9RtAAFXqCCIGC4676.jpg

圖5:安裝在電池上方的遠程控制器

步驟 2: 模塊

我們正在使用的是nRF24L01+無線收發器模塊。nRF24L01+是一款超低功耗的無線射頻收發器。對于此類應用程序,該模塊是最佳選擇。它以其出色的性能和低廉的價格成為最受歡迎的型號之一,同時,該模塊通用的通信協議使其能夠與全球廣泛使用的軟件兼容。

nRF24L01+ 資料

規格:

工作頻率 2.4GHz – 126 通道

速度: 250kbps, 1 和 2 Mbps

發射器: 輸出功率為0dBm 時是11.3mA

最大功率: 100mW (由于前置放大器)

接口: 4 引腳 SPI – 有效負載: 32 字節

poYBAGPzETeAAxnhAAN5VQmtd0s244.jpg

圖6:NRF24L01+模塊

為了獲取壓力和溫度數據,我們將使用Sparkfun BMP085氣壓傳感器。該傳感器提供300至110 kPa的測量范圍,誤差為0.03 kPa。BMP085還可以提供0至65 °C范圍內的溫度測量功能。其承受的電壓必須在1.8-3.6V范圍內,并通過l2C直接與微控制器建立連接。

BMP085 資料表

規格:

接口(l2C)

寬氣壓范圍

寬電壓范圍

極低的電流損耗

低噪環境測量

完全較準

含運動傳感器

pYYBAGPzETqABADnAAFYTj_bxU8783.jpg

圖7:BMP085氣壓傳感器

現在我們將要安裝HC-SR04超聲波傳感器。HC-SR04的檢測范圍為2-200厘米。微控制器向傳感器發送激發聲波的脈沖。當傳感器感知到聲波已返回時,將向微控制器發送回脈沖,計算發送脈沖的時間與接收到脈沖的時間之間的差值即可算出距離。

D=(t2?t1)×170

poYBAGPzET2AZy1QAAFaLoKtPfU792.jpg

圖8:位于車體正面的HC-SR04距離傳感器

步驟 3: 數據路由

Arduino平臺提供了預定義的功能,使用者無需對一些寄存器進行配置。可以通過一些庫來實現平臺與其他外圍設備的接口。使用一根Arduino-PC電纜就可以以非常簡單地完成編程。該開發板配有USB-UART轉換器

在本項目中,需要有兩個程序:一個用于機器人的功能,另一個用于遠程控制器。這兩個程序通過nRF24101+模塊以無線電的方式相互通信。數據流程圖如圖9所示。有兩種方式。正向傳遞:首先,信息被應用程序發送到Arduino。然后由收發器接管的信息將進一步發送到第二個收發器,再返回到微控制器。這將用于控制機器人的機體運動。

poYBAGPzEUCAQA5HAAB4mVCVbRg817.jpg

圖9:數據流程圖

反向傳遞:控制器從傳感器獲取信息并進行處理,然后將其發送到OTA(空中下載技術),使其最終到達PC端。

步驟 4: 應用程序

該應用程序是通過Microsoft Visual Studio 2010使用Visual C#編程語言來完成的。Visual Studio在編輯部分融入視覺元素,具有非常簡潔直觀的界面。這有助于實現一些復雜的應用程序。該應用程序可以發送指令,接收數據并進行顯示。機器人的控制由鍵盤上的箭頭按鍵來實現。當您按下箭頭按鍵的時候,運動按鈕會亮起,表示指令已經被接收到。這些指令其實是串行傳送的字母,最后會到達機器人控制器進行解碼。例如,當您按下“向上”鍵時,應用程序通過USB在串行端口發送“U”,指令的解碼表如下所示:

字母 動作
U 前進
R 右轉
D 向后移動
L 左轉
N 更新
B 打開燈光
O 發送PWM值

為了達到該效果,我們應用了以下算法:應用程序發送LED燈“打開”指令,然后遠程控制器接收指令并將其發送給機器人。一旦機器人接收到指令,就會打開LED并向應用程序發送指令打開指示燈。我們引入該算法來避免產生不同步的問題(LED熄滅但指示燈亮起的情況)。

另一個重要問題是界面中信息的導入和顯示。為了使應用程序能夠區分信息并知道在哪里顯示,我們實施了以下方法:一旦機器人從遠程控制器接收到信息,它不僅僅只是進行簡單的傳送,還會對其進行處理并發送類似這樣的指令:“CMD: TE =” + val.marime。應用程序就會在通過串行端口檢索到以“CMD”開頭的信息時刪除掉“:”并讀取之后的兩個字母,這兩個字母表示的是信息將會被寫入的區域。“val. marime”會在“=”之后被讀取,對于以上示例,程序將會把讀取到的數據分配到溫度區域中。

為了使應用程序能夠識別同時按下的兩個按鍵,我們已經為每個按鍵初始化了一個變量。當按下一個按鍵時,對應事件就會其變量的值增加到1;當釋放按鍵時,對應事件就會將其變量減少到0。計時器將會持續計算這些變量的值。

pYYBAGPzEUeAWyT2AAKhPHbp02Q886.jpg

圖10:設計應用程序

步驟 5: 關于程序

機器人使用的是在Arduino IDE中編譯的程序,比遠程控制器的程序要復雜的多:

程序定義了向前/向后移動,轉彎,開燈,計算距離、溫度和壓力的函數。

主程序是一個無限循環程序,將會持續判斷無線電模塊是否接收到信息,如果有,就會對輸入的代碼進行處理。

如果輸入信息與程序中的一條預設指令匹配,那么將根據收到的字母執行相應功能。

當從傳感器接收到傳遞信息的指令時,將會運行多個函數來對信息進行收集,并將其添加到將被傳遞的向量中。

如果我們要運行的是有關運動的函數,則當收到“U”,“D”,“R”或“L”時,程序將執行一個指令20ms。盡管這個時間很短,但通過持續按下筆記本電腦上的按鍵,就可以非常快速地發送一連串的指令。

步驟 6: 代碼

1. 遠程控制器

#include 
#include "nRF24L01.h"
#include "RF24.h"
char cmd[3];
RF24 radio(9,10);
const uint64_t pipes[2] ={ 0xE8E8F0F0E1LL, 0xDEDEDEDEE7LL} ;
float bar[7];
char arc[3];
int cifra[3];
int val;
int a;
void setup(void){
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
radio.setDataRate(RF24_250KBPS);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
}
void loop(void){
if(Serial) {
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
}
else {
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
}
cmd[0]=Serial.read();

if(cmd[0]=='O') {
delay(20);
arc[0]=Serial.read();
delay(20);
arc[1]=Serial.read();
delay(20);
arc[2]=Serial.read();

//Storing the values
cifra[0]=arc[0]-'0';
cifra[1]=arc[1]-'0';
cifra[2]=arc[2]-'0';
val=10*cifra[0]+cifra[1];
Serial.println(val);
Serial.println(sizeof(cmd));
cmd[0]='X';
cmd[1]=val;
cmd[2]=cifra[2];
radio.write(cmd, sizeof(cmd));
}
a=1;

if(cmd[0]=='N') {
radio.write(cmd, sizeof(cmd));
radio.startListening();

delay(1);
while(a==1) {

if (radio.available()){
a=2;
bool done = false;
while (!done){
done = radio.read(bar, 28);
Serial.print("CMD:X1=");
Serial.println(bar[0]);
delay(5);

Serial.print("CMD:D1=");
Serial.println(bar[1]);
delay(5);
Serial.print("CMD:TE=");
Serial.println(bar[2]);
delay(5);
Serial.print("CMD:PR=");
Serial.println(bar[3]);
delay(5);
Serial.print("CMD:AT=");
Serial.println(bar[4]);
delay(5);
Serial.print("CMD:AL=");
Serial.println(bar[5]);
Serial.print("CMD:LE=");
Serial.println(bar[6]);

}
}
}
}
else {
radio.write(cmd, sizeof(cmd));
}
}

2. 機器人

#include 
#include "nRF24L01.h"
#include "RF24.h"
#include
#define BMP085_ADDRESS 0x77 // I2C address of BMP085
#define trigPin 2
#define echoPin 4

const unsigned char OSS = 0;
int pwm, test1, test2;
char cmd[3];
RF24 radio(9,10);
const uint64_t pipes[2] ={ 0xE8E8F0F0E1LL, 0xDEDEDEDEE7LL} ;
float bar[7];
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;
float temperature, pressure, atm, altitude,leduri;
long b5;

void bmp085Calibration()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}

// Calculate temperature in deg C
float bmp085GetTemperature(unsigned int ut){
long x1, x2;

x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
x2 = ((long)mc << 11)/(x1 + md); b5 = x1 + x2; float temp = ((b5 + 8)>>4);
temp = temp /10;

return temp;
}

// Calculate pressure given up
// calibration values must be known
// b5 is also required so bmp085GetTemperature(...) must be called first.
// Value returned will be pressure in units of Pa.
long bmp085GetPressure(unsigned long up){
long x1, x2, x3, b3, b6, p;
unsigned long b4, b7;

b6 = b5 - 4000;
// Calculate B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((long)ac1)*4 + x3)<>2;

// Calculate B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;

b7 = ((unsigned long)(up - b3) * (50000>>OSS));
if (b7 < 0x80000000)
p = (b7<<1)/b4;
else
p = (b7/b4)<<1; x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;

long temp = p;
return temp;
}

// Read 1 byte from the BMP085 at 'address'
char bmp085Read(unsigned char address)
{
unsigned char data;

Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();

Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available())
;

return Wire.read();
}

// Read 2 bytes from the BMP085
// First byte will be from 'address'
// Second byte will be from 'address'+1
int bmp085ReadInt(unsigned char address)
{
unsigned char msb, lsb;

Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();

Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();

return (int) msb< }

// Read the uncompensated temperature value
unsigned int bmp085ReadUT(){
unsigned int ut;

// Write 0x2E into Register 0xF4
// This requests a temperature reading
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();

// Wait at least 4.5ms
delay(5);

// Read two bytes from registers 0xF6 and 0xF7
ut = bmp085ReadInt(0xF6);
return ut;
}

// Read the uncompensated pressure value
unsigned long bmp085ReadUP(){

unsigned char msb, lsb, xlsb;
unsigned long up = 0;

// Write 0x34+(OSS<<6) into register 0xF4
// Request a pressure reading w/ oversampling setting
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();

// Wait for conversion, delay time dependent on OSS
delay(2 + (3<> (8-OSS);

return up;
}

void writeRegister(int deviceAddress, byte address, byte val) {
Wire.beginTransmission(deviceAddress); // start transmission to device
Wire.write(address); // send register address
Wire.write(val); // send value to write
Wire.endTransmission(); // end transmission
}

int readRegister(int deviceAddress, byte address){

int v;
Wire.beginTransmission(deviceAddress);
Wire.write(address); // register to read
Wire.endTransmission();

Wire.requestFrom(deviceAddress, 1); // read a byte

while(!Wire.available()) {
// waiting
}

v = Wire.read();
return v;
}

float calcAltitude(float pressure){

float A = pressure/101325;
float B = 1/5.25588;
float C = pow(A,B);
C = 1 - C;
C = C /0.0000225577;

return C;
}

int distance2() {

long duration, distance;
digitalWrite(trigPin, LOW); // Added this line
delayMicroseconds(2); // Added this line
digitalWrite(trigPin, HIGH);

delayMicroseconds(10); // Added this line
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
if (distance < 4) { // This is where the LED On/Off happens } else { } if (distance >= 200 || distance <= 0){

}
else {

}
return distance;
}

void setup(void){
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
bar[0] ='A';
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(1,pipes[0]);
radio.openWritingPipe(pipes[1]);
radio.startListening();
radio.setDataRate(RF24_250KBPS);

pwm=255;
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(2, OUTPUT);
pinMode(4, INPUT);
pinMode(3, OUTPUT);
Wire.begin();
bmp085Calibration();
}
void mersF(int timp, int pwm) {
analogWrite(5, pwm);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
delay(timp);
digitalWrite(5, LOW);
}
void mersS(int timp, int pwm) {
analogWrite(6, pwm);
digitalWrite(5, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
delay(timp);
digitalWrite(6, LOW);
}
void VirareD(int timp, int pwm) {

analogWrite(5, pwm);
digitalWrite(6, LOW);
digitalWrite(8, HIGH);
digitalWrite(7, LOW);
delay(timp);
digitalWrite(5, LOW);
digitalWrite(8, LOW);
}
void VirareS(int timp, int pwm) {
analogWrite(5, pwm);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(timp);
digitalWrite(7, LOW);
digitalWrite(5, LOW);

}
void VirareDspate(int timp, int pwm) {
analogWrite(6, pwm);
digitalWrite(5, LOW);
digitalWrite(8, HIGH);
digitalWrite(7, LOW);
delay(timp);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
}
void VirareSspate(int timp, int pwm) {
analogWrite(6, pwm);
digitalWrite(5, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(timp);
digitalWrite(7, LOW);
digitalWrite(6, LOW);
}

void stop(){
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void trimitere() {
temperature = bmp085GetTemperature(bmp085ReadUT()); //MUST be called first
pressure = bmp085GetPressure(bmp085ReadUP());
atm = pressure / 101325; // "standard atmosphere"
altitude = calcAltitude(pressure); //Uncompensated caculation - in Meters
leduri=digitalRead(3);

radio.stopListening();
bar[0]=analogRead(A2);
bar[1]=distance2();
bar[2]=temperature;
bar[3]=pressure;
bar[4]=atm;
bar[5]=altitude;
bar[6]=leduri;
radio.write(bar, sizeof(bar));
delay(200);
radio.startListening();
}

void aprindere() {
if(digitalRead(3)) digitalWrite(3,LOW);
else digitalWrite(3,HIGH);
delay(30);
}

void loop(void){
if (radio.available()){
bool done = false;
while (!done){
done = radio.read(cmd, 3);
if (cmd[0] == 'U'){
Serial.println("Exec cmd: Up");
mersF(30,pwm);
}
else if (cmd[0] == 'E'){
Serial.println("Exec cmd: Right");
VirareD(30,pwm);
}
else if (cmd[0] == 'C'){
Serial.println("Exec cmd: Right");
VirareDspate(30, pwm);
}
else if (cmd[0] == 'Z'){
Serial.println("Exec cmd: Right");
VirareSspate(30,pwm);
}
else if (cmd[0] == 'D'){
Serial.println("Exec cmd: Down");
mersS(30,pwm);
}
else if (cmd[0] == 'Q'){
Serial.println("Exec cmd: Left");
VirareS(30, pwm);
}
else if (cmd[0] == 'N'){
delay(30);
trimitere();
}
else if (cmd[0] == 'B'){
delay(30);
aprindere();
}
else if (cmd[0] == 'J'){
stop();
delay(30);
}
 
else if (cmd[0] == 'X'){
 
test1=cmd[1];
test2=cmd[2];
pwm=test1*10+test2;
delay(30);
}
else {
}
}
}
}

poYBAGPzER6ACV2tAAGs0Hy8lDQ325.jpg

圖11:完成的RF機器人

poYBAGPzEU6AQ05BAAGmfaJZfXg813.jpg

圖12:組裝好的RF機器人(側視圖)

現在,我們已經構建了一個自主arduino機器人,該機器人能夠自主導航并從周圍環境中收集數據!這是一個非常具有挑戰性又很有意義的項目。這個原型還可以進行進一步的改善,例如添加用于在崎嶇地形/環境中提供保護的外殼。如果您有任何改進的建議,請隨時與我分享!

pYYBAGPzDmSAfn_UAAAF-_P5AGo881.jpg

Tiberia Todeila

Tiberia目前是羅馬尼亞布加勒斯特理工大學電氣工程學院的大四學生。她非常熱衷于設計和開發讓日常生活更輕松的智能居家設備。

審核編輯黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 機器人
    +關注

    關注

    211

    文章

    28512

    瀏覽量

    207498
收藏 人收藏

    評論

    相關推薦

    【「具身智能機器人系統」閱讀體驗】2.具身智能機器人的基礎模塊

    具身智能機器人的基礎模塊,這個是本書的第二部分內容,主要分為四個部分機器人計算系統,自主機器人的感知系統,自主
    發表于 01-04 19:22

    《具身智能機器人系統》10-13章閱讀心得之具身智能機器人計算挑戰

    閱讀《具身智能機器人系統》10-13章,我對具身智能機器人的工程實踐有了全新認識。10章從實時性角度剖析了機器人計算加速問題。
    發表于 01-04 01:15

    開源項目!能夠精確地行走、跳舞和執行復雜動作的機器人—Tillu

    的語音識別系統響應語音指令 為什么打造Tillu? 打造Tillu不僅是一個項目,更是一次學習體驗。通過深入探索機器人技術、編程細節以及自定義動作和表情,釋放你的創造力。無論你是學生、愛好還是創
    發表于 01-02 17:24

    【「具身智能機器人系統」閱讀體驗】1.初步理解具身智能

    重要。 書中還詳細介紹了支持具身智能機器人的核心技術系統,包括自主機器人計算系統、感知系統、定位系統及規劃和控制系統。 本書共5個部分
    發表于 12-28 21:12

    《具身智能機器人系統》1-6章閱讀心得之具身智能機器人系統背景知識與基礎模塊

    ,互聯網行業占成熟經濟體的GDP增長的21%,世界經濟正面向數字經濟轉型的大趨勢。具身智能機器人集成人工智能、高端制造、新材料等技術,其核心在于通過智能體與環境的動態互動實現智能行為。 在2章“具身
    發表于 12-19 22:26

    開源項目!可以自主演奏音樂的尤克里里機器人

    一些,可能需要一些反復試驗。 為了讓機器人撥動琴弦,找到每根琴弦的位置并將其放入代碼中,以便撥片輕輕地放在四根琴弦中每根琴弦的一側。后面部分的代碼可能會對此有所幫助(刪除不必要的部分)。
    發表于 11-25 14:41

    智能網聯汽車云控系統2部分:車云數據交互規范

    智能網聯汽車云控系統 2部分 車云數據交互規范
    發表于 11-18 15:04 ?0次下載

    【開源項目】你準備好DIY一款功能強大的機器人了嗎?

    和OLED顯示屏的組裝后,再次檢查整個電路板的功能和連接情況,確保所有組件都正常工作,并且沒有松動或損壞的情況。這樣,你的電路板就可以與機器人底盤等其他
    發表于 11-08 10:53

    如何進行電源設計–2部分

    電子發燒友網站提供《如何進行電源設計–2部分.pdf》資料免費下載
    發表于 09-07 11:09 ?0次下載
    如何進行電源設計–<b class='flag-5'>第</b><b class='flag-5'>2</b><b class='flag-5'>部分</b>

    電源設計方法-5部分

    電子發燒友網站提供《電源設計方法-5部分.pdf》資料免費下載
    發表于 09-06 14:58 ?0次下載
    電源設計方法-<b class='flag-5'>第</b>5<b class='flag-5'>部分</b>

    電源設計方法-6部分

    電子發燒友網站提供《電源設計方法-6部分.pdf》資料免費下載
    發表于 09-06 14:57 ?0次下載
    電源設計方法-<b class='flag-5'>第</b>6<b class='flag-5'>部分</b>

    電源設計方法-3部分

    電子發燒友網站提供《電源設計方法-3部分.pdf》資料免費下載
    發表于 09-06 14:56 ?0次下載
    電源設計方法-<b class='flag-5'>第</b>3<b class='flag-5'>部分</b>

    電源設計方法-2部分

    電子發燒友網站提供《電源設計方法-2部分.pdf》資料免費下載
    發表于 09-06 11:42 ?1次下載
    電源設計方法-<b class='flag-5'>第</b><b class='flag-5'>2</b><b class='flag-5'>部分</b>

    電源設計方法-1部分

    電子發燒友網站提供《電源設計方法-1部分.pdf》資料免費下載
    發表于 09-06 11:40 ?0次下載
    電源設計方法-<b class='flag-5'>第</b>1<b class='flag-5'>部分</b>

    電源設計方法-4部分

    電子發燒友網站提供《電源設計方法-4部分.pdf》資料免費下載
    發表于 09-06 11:39 ?0次下載
    電源設計方法-<b class='flag-5'>第</b>4<b class='flag-5'>部分</b>
    主站蜘蛛池模板: 在线 国产 欧美 亚洲 天堂| 丰满艳妇亲伦| 久久99国产精品一区二区| 亚洲一卡久久4卡5卡6卡7卡| 精品无码人妻一区二区免费AV| 一个人在线观看的视频| 免费高清毛片| 二级片免费看| 野花4在线观看| 青青草久久| 国产精品香蕉视频在线| 月夜直播免费观看全集| 日本邪恶少女漫画大全| 果冻传媒2021一二三区| 2017最新伦理伦理片67| 色欲AV亚洲午夜精品无码| 久九九精品免费视频| xxx粗大长欧美| 亚洲男人天堂2018av| 欧美人与动牲交A精品| 国产精品综合AV一区二区国产馆| 伊人久久久久久久久香港| 青青草原在线新免费| 精品无码国产自产在线观看水浒传 | 97免费视频在线| 无遮掩H黄纯肉动漫在线观看星| 久久最新地址获取| 国产成人8x视频一区二区| 最新2017年韩国伦理片在线| 翁熄性放纵交换300章| 美女xx00| 黑人开嫩苞| 俄罗斯少女人体| 综合亚洲桃色第一影院| 午夜国产精品视频| 欧美日韩888在线观看| 精品三级久久久久电影网1| 国产成人精品久久久久婷婷| 2019香蕉在线观看直播视频| 亚洲国产果果在线播放在线| 日本亚洲精品无码区国产电影|