工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

ArduinoNanoを使用して自宅でミニオシロスコープを作成する方法

コンポーネントと消耗品

>
Arduino Nano R3
× 1
ElectroPeak 0.96 "OLED64x128ディスプレイモジュール
× 1
触覚スイッチ、上部作動
× 9
1N4148 –汎用高速スイッチング
× 4

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

このビデオでは、自宅で独自のミニオシロスコープを作成する方法を紹介します。シンプルで簡単に作成できます。自分のコードではなく、チュートリアルを作成するだけです。このプロジェクトを作成するために、私はサードパーティのソースコードに依存していました。リンクは以下のとおりです。ご質問やご提案がございましたら、YouTube動画にコメントしてください。 YouTubeチャンネルを気に入って登録することを忘れないでください

完全なチュートリアルとソースコードについては、ここをクリックしてください。

私のIG:https://www.instagram.com/pm.goharian/

必要なコンポーネント

  • Arduino Nano
  • SSD1306OLEDディスプレイ
  • 1N4148
  • マイクロスイッチ
  • 104コンデンサ
  • 抵抗:100Ω、12k、120k、510k

オシロスコープとは何ですか?

以前は「オシロスコープ」と呼ばれ、非公式にはスコープと呼ばれていた「オシロスコープ」 または o-scope CRO (陰極線オシロスコープの場合)、または DSO (最新のデジタルストレージオシロスコープの場合)は、さまざまな信号[電圧]をグラフィカルに表示するタイプの電子テスト機器であり、通常は時間の関数としての1つまたは複数の信号の2次元プロットとして表示されます。他の信号(音や振動など)を電圧に変換して表示することができます。

オシロスコープは、時間の経過に伴う電気信号の変化を、電圧と時間をそれぞれY軸とX軸として校正されたスケールで表示します。次に、振幅、周波数、立ち上がり時間、時間間隔、歪みなどの特性について波形を分析できます。最新のデジタル機器は、これらのプロパティを直接計算して表示する場合があります。もともと、これらの値を計算するには、機器の画面に組み込まれているスケールに対して波形を手動で測定する必要がありました。

プロジェクトの回路図

注: 回路内のすべての接続が回路図とまったく同じであることを確認してください。

<図>

<図>

<図>

参照:

http://radiopench.blog96.fc2.com/blog-entry-893.html

https://www.wikipedia.org/

コード

  • コード
コード C / C ++
 / *(_ 20190212_OLEDoscilloscope.ino)1285byte ram free 2019/02/12 * /#include  #include  #include  #include  // PROGMEM#include  #define SCREEN_WIDTH 128 // OLEDディスプレイ幅#defineSCREEN_HEIGHT 64 // OLEDディスプレイ高さ#defineREC_LENGTH 200 // // I2Cに接続されたSSD1306ディスプレイの宣言(SDA、SCLピン) #define OLED_RESET -1 //リセットピン#(またはArduinoリセットピンを共有している場合は-1)Adafruit_SSD1306 display(SCREEN_WIDTH、SCREEN_HEIGHT、&Wire、OLED_RESET); // const char vRangeName [10] [5] PROGMEM ={"A50V"、 "A 5V"、 "50V"、 "20V"、 "10V"、 "5V"、 "2V"、 "1V"、 "0.5V​​"、 "0.2V"}; // \ 0const char * const vstring_table [] PROGMEM ={vRangeName [0]、vRangeName [1]、vRangeName [2]、vRangeName [3]、vRangeName [4]、vRangeName [5]、vRangeName [6]、vRangeName [ 7]、vRangeName [8]、vRangeName [9]}; const char hRangeName [8] [6] PROGMEM ={"50ms"、 "20ms"、 "10ms"、 "5ms"、 "2ms"、 "1ms"、 "500us"、 "200us"}; //(48const char * const hstring_table [] PROGMEM ={hRangeName [0]、hRangeName [1]、hRangeName [2]、hRangeName [3]、hRangeName [4]、hRangeName [5]、hRangeName [6]、hRangeName [ 7]}; int waveBuff [REC_LENGTH]; //(RAM)char chrBuff [10]; // String hScale ="xxxAs"; String vScale ="xxxx"; float lsb5V =0.0055549; // 5V0.005371 V / 1LSBfloat lsb50V =0.051513; // 50V 0.05371volatile int vRange; // 0:A50V、1:A 5V、2:50V、3:20V、4:10V、5:5V、6:2V、7:1V、8:0.5 Vvolatile int hRange; // 0:50m、1:20m、2:10m、3:5m、4; 2m、5:1m、6:500u、7; 200uvolatile int trigD; // 0:1:volatile int scopeP; // 0:、1:、2:volatile boolean hold =false; // volatile boolean paraChanged =false; // truevolatile int saveTimer; // EEPROMint timeExec; //(ms)int dataMin; //(min:0) int dataMax; //(max:1023)int dataAve; // 10 max:10230)int rangeMax; // int rangeMin; // int rangeMaxDisp; // max100int rangeMinDisp; // minint trigP; //ブールtrigSync; // int att10x; // 1void setup(){pinMode(2、INPUT_PULLUP); //(int0 pinMode(8、INPUT_PULLUP); // pinMode(9、INPUT_PULLUP);を選択します; // Up pinMode(10、INPUT_PULLUP); // Down pinMode(11、INPUT_PULLUP); // pinMode(12、INPUT)を保持します; // 1/10 pinMode(13、OUTPUT); // // Serial.begin(115200); // RAM if(!display.begin(SSD1306_SWITCHCAPVCC、0x3C)){// 128x64のアドレス0x3C //シリアル。 println(F( "SSD1306 failed")); for(;;); //続行しないで永久ループ} loadEEPROM(); // EEPROM analogReference(INTERNAL); // ADC1.1Vvref)attachInterrupt(0、pin2IRQ 、 落下); // startScreen(); //} void loop(){digitalWrite(13、HIGH); setConditions(); // RAM40 readWave(); //(1.6ms)digitalWrite(13、LOW); // dataAnalize(); //(0.4-0.7ms)writeCommonImage(); //(4.6ms)plotData(); //(5.4ms +)dispInf(); //(6.2ms)display.display(); //(37ms)saveEEPROM(); // EEPROM while(hold ==true){// dispHold();を保持しますdelay(10); }} void setConditions(){// // PROGMEM strcpy_P(chrBuff、(char *)pgm_read_word(&(hstring_table [hRange]))); // hScale =chrBuff; // hScale // strcpy_P(chrBuff、(char *)pgm_read_word(&(vstring_table [vRange]))); // vScale =chrBuff; // vScaleスイッチ(vRange){//ケース0:{// Auto50V // rangeMax =1023; // rangeMin =0; att10x =1; // 壊す; }ケース1:{//自動5V // rangeMax =1023; // rangeMin =0; att10x =0; // 壊す; }ケース2:{// 50V rangeMax =50 / lsb50V; // rangeMaxDisp =5000; // 100 rangeMin =0; rangeMinDisp =0; att10x =1; // 壊す; }ケース3:{// 20V rangeMax =20 / lsb50V; // rangeMaxDisp =2000; rangeMin =0; rangeMinDisp =0; att10x =1; // 壊す; }ケース4:{// 10V rangeMax =10 / lsb50V; // rangeMaxDisp =1000; rangeMin =0; rangeMinDisp =0; att10x =1; // 壊す; }ケース5:{// 5V rangeMax =5 / lsb5V; // rangeMaxDisp =500; rangeMin =0; rangeMinDisp =0; att10x =0; // 壊す; }ケース6:{// 2V rangeMax =2 / lsb5V; // rangeMaxDisp =200; rangeMin =0; rangeMinDisp =0; att10x =0; // 壊す; }ケース7:{// 1V rangeMax =1 / lsb5V; // rangeMaxDisp =100; rangeMin =0; rangeMinDisp =0; att10x =0; // 壊す; }ケース8:{// 0.5V rangeMax =0.5 / lsb5V; // rangeMaxDisp =50; rangeMin =0; rangeMinDisp =0; att10x =0; // 壊す; }ケース9:{// 0.5V rangeMax =0.2 / lsb5V; // rangeMaxDisp =20; rangeMin =0; rangeMinDisp =0; att10x =0; // 壊す; }}} void writeCommonImage(){// display.clearDisplay(); //(0.4ms)display.setTextColor(WHITE); // display.setCursor(86、0); //左上隅から開始display.println(F( "av V")); // 1 display.drawFastVLine(26、9、55、WHITE); // display.drawFastVLine(127、9、55、WHITE); // display.drawFastHLine(24、9、7、WHITE); //最大display.drawFastHLine(24、36、2、WHITE); // display.drawFastHLine(24、63、7、WHITE); // display.drawFastHLine(51、9、3、WHITE); //最大display.drawFastHLine(51、63、3、WHITE); // display.drawFastHLine(76、9、3、WHITE); //最大display.drawFastHLine(76、63、3、WHITE); // display.drawFastHLine(101、9、3、WHITE); //最大display.drawFastHLine(101、63、3、WHITE); // display.drawFastHLine(123、9、5、WHITE); //最大display.drawFastHLine(123、63、5、WHITE); // for(int x =26; x <=128; x + =5){display.drawFastHLine(x、36、2、WHITE); //()} for(int x =(127-25); x> 30; x- =25){for(int y =10; y <63; y + =5){display.drawFastVLine(x、y 、2、白); // 3}}} void readWave(){// if(att10x ==1){// 1/10 pinMode(12、OUTPUT); // digitalWrite(12、LOW); // LOW} else {// pinMode(12、INPUT); // Hi-z} switch(hRange){//ケース0:{// 50ms timeExec =400 + 50; //(ms)EEPROM ADCSRA =ADCSRA&0xf8; // 3 ADCSRA =ADCSRA | 0x07; // 128(arduino for(int i =0; i  dataMax){// dataMax =d; }} // dataAve =(sum + 10)/ 20; // 10 // max、min if(vRange <=1){// Auto1 rangeMin =dataMin-20; // -20 rangeMin =(rangeMin / 10)* 10; // 10 if(rangeMin <0){rangeMin =0; // 0} rangeMax =dataMax + 20; // +20 rangeMax =((rangeMax / 10)+ 1)* 10; // 10 if(rangeMax> 1020){rangeMax =1023; // 10201023} if(att10x ==1){// rangeMaxDisp =100 *(rangeMax * lsb50V); // ADC rangeMinDisp =100 *(rangeMin * lsb50V); //} else {// rangeMaxDisp =100 *(rangeMax * lsb5V); rangeMinDisp =100 *(rangeMin * lsb5V); }} else {// //} // for(trigP =((REC_LENGTH / 2)-51); trigP <((REC_LENGTH / 2)+ 50); trigP ++){// if(trigD ==0){ // 0 if((waveBuff [trigP-1] <(dataMax + dataMin)/ 2)&&(waveBuff [trigP]> =(dataMax + dataMin)/ 2)){break; //}} else {// 0 if((waveBuff [trigP-1]>(dataMax + dataMin)/ 2)&&(waveBuff [trigP] <=(dataMax + dataMin)/ 2)){break; } //}} trigSync =true; if(trigP> =((REC_LENGTH / 2)+ 50)){// trigP =(REC_LENGTH / 2); trigSync =false; //非同期}} void startScreen(){// display.clearDisplay(); display.setTextSize(1); // 2 display.setTextColor(WHITE); // display.setCursor(10、25); // display.println(F( "PM.GOHARIAN")); // display.setCursor(10、45); // display.println(F( "Pen oscope")); display.display(); // delay(5000); display.clearDisplay(); display.setTextSize(1); //} void dispHold(){// display.fillRect(32、12、24、8、BLACK);を保持します// 4 display.setCursor(32、12); display.print(F( "Hold")); // display.display();を保持します//} void dispInf(){//フロート電圧; // display.setCursor(2、0); // display.print(vScale); // if(scopeP ==0){// display.drawFastHLine(0、7、27、WHITE); // display.drawFastVLine(0、5、2、WHITE); display.drawFastVLine(26、5、2、WHITE); } // display.setCursor(34、0); // display.print(hScale); //(time / div)if(scopeP ==1){// display.drawFastHLine(32、7、33、WHITE); // display.drawFastVLine(32、5、2、WHITE); display.drawFastVLine(64、5、2、WHITE); } // display.setCursor(75、0); // if(trigD ==0){display.print(char(0x18)); //} else {display.print(char(0x19)); //} if(scopeP ==2){// display.drawFastHLine(71、7、13、WHITE); // display.drawFastVLine(71、5、2、WHITE); display.drawFastVLine(83、5、2、WHITE); } // if(att10x ==1){// 10電圧=dataAve * lsb50V / 10.0; // 50V} else {電圧=dataAve * lsb5V / 10.0; // 5V} dtostrf(電圧、4、2、chrBuff); // x.xx display.setCursor(98、0); // display.print(chrBuff); // // display.print(saveTimer); ////電圧=rangeMaxDisp / 100.0; //最大if(vRange ==1 || vRange> 4){// 5VAuto5V dtostrf(電圧、4、2、chrBuff); //*。**}else{// dtostrf(電圧、4、1、chrBuff); //**。*}display.setCursor(0、9); display.print(chrBuff); //最大電圧=(rangeMaxDisp + rangeMinDisp)/ 200.0; // if(vRange ==1 || vRange> 4){// 5VAuto5V dtostrf(電圧、4、2、chrBuff); // 2} else {// dtostrf(電圧、4、1、chrBuff); // 1} display.setCursor(0、33); display.print(chrBuff); //電圧=rangeMinDisp / 100.0; //最小if(vRange ==1 || vRange> 4){// 5VAuto5V dtostrf(電圧、4、2、chrBuff); // 2} else {dtostrf(電圧、4、1、chrBuff); // 1} display.setCursor(0、57); display.print(chrBuff); //最小// if(trigSync ==false){// display.setCursor(60、55); // display.print(F( "Unsync")); //非同期}} void plotData(){// long y1、y2; for(int x =0; x <=98; x ++){y1 =map(waveBuff [x + trigP-50]、rangeMin、rangeMax、63、9); // y1 =Constraint(y1、9、63); // y2 =map(waveBuff [x + trigP-49]、rangeMin、rangeMax、63、9); // y2 =Constraint(y2、9、63); // display.drawLine(x + 27、y1、x + 28、y2、WHITE); //}} void saveEEPROM(){// EEPROM if(paraChanged ==true){// saveTimer =saveTimer --timeExec; // if(saveTimer <0){// paraChanged =false; // EEPROM.write(0、vRange); // EEPROM.write(1、hRange); EEPROM.write(2、trigD); EEPROM.write(3、scopeP); }}} void loadEEPROM(){// EEPROM int x; x =EEPROM.read(0); // vRange if((x <0)||(x> 9)){// 0-9 x =3; //} vRange =x; x =EEPROM.read(1); // hRange if((x <0)||(x> 7)){// 0-9 x =3; //} hRange =x; x =EEPROM.read(2); // trigD if((x <0)||(x> 1)){// 0-9 x =1; //} trigD =x; x =EEPROM.read(3); // scopeP if((x <0)||(x> 2)){// 0-9 x =1; //} scopeP =x;} void pin2IRQ(){// Pin2(int0)// pin8,9,10,11Pin2 // int x; // x =PINB; // B if((x&0x07)!=0x07){// 3High saveTimer =5000; // EEPROM(ms paraChanged =true; // ON} if((x&0x01)==0){scopeP ++; if(scopeP> 2){scopeP =0;}} if((x&0x02)==0 ){// UP if(scopeP ==0){// vRange ++; if(vRange> 9){vRange =9;}} if(scopeP ==1){// hRange ++; if(hRange> 7){hRange =7;}} if(scopeP ==2){// trigD =0; //}} if((x&0x04)==0){// DOWN if(scopeP ==0){// vRange- -; if(vRange <0){vRange =0;}} if(scopeP ==1){// hRange--; if(hRange <0){hRange =0;}} if(scopeP ==2){ // trigD =1; //}} if((x&0x08)==0){// HOLD hold =!hold; //}} 

回路図


製造プロセス

  1. 自宅でDIY宿題ライティングマシンを作る
  2. Arduino Nano RP2040を使用したDIYPhotoshop編集コンソール
  3. 自宅で一から炭素繊維を作る方法
  4. Arduinoを使用してモニターをAmbilightにする
  5. カスタマイズ可能なパンチ可能なキーボードボタンの作り方
  6. Arduinoを使用して地球の質量を測定する方法
  7. PHPを使用してArduinoと通信するWebサイトを作成する方法
  8. Arduinoで音楽を作る方法
  9. Arduinoベースの自動ドア開口部の作り方
  10. ArduinoNanoで食べるロボットを作る|金ネジ
  11. ArduinoとProcessingIDEを使用してコンパスを作成する方法