Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Comment fabriquer un mini oscilloscope à la maison avec Arduino Nano

Composants et fournitures

Arduino Nano R3
× 1
Module d'affichage OLED 64x128 ElectroPeak 0.96"
× 1
Commutateur tactile, actionné par le haut
× 9
1N4148 – Commutation rapide à usage général
× 4

Applications et services en ligne

Arduino IDE

À propos de ce projet

Dans cette vidéo, je vais vous montrer comment fabriquer votre propre mini oscilloscope à la maison. C'est simple et facile à faire. Ce n'est pas mon propre code, je fais juste un tutoriel pour vous les gars. Pour réaliser ce projet, j'avais dépendu du code source tiers, dont le lien est donné ci-dessous. Si vous avez des questions ou des suggestions, n'hésitez pas à commenter ma vidéo youtube et n'oubliez pas d'aimer et de vous abonner à ma chaîne YouTube .

Cliquez ici pour le didacticiel complet et le code source.

Mon IG :https://www.instagram.com/pm.goharian/

Composants nécessaires

  • Arduino Nano
  • Écran OLED SSD1306
  • 1N4148
  • Microrupteur
  • Condensateur 104
  • Résistances :100 , 12 k, 120 k, 510 k

Qu'est-ce qu'un oscilloscope ?

Un « oscilloscope », auparavant appelé « oscillographe », et officieusement connu sous le nom de scope ou o-scope ,CRO (pour oscilloscope cathodique), ou DSO (pour l'oscilloscope à stockage numérique plus moderne), est un type d'instrument de test électronique qui affiche graphiquement des signaux variables [tensions], généralement sous la forme d'un tracé bidimensionnel d'un ou plusieurs signaux en fonction du temps. D'autres signaux (tels que le son ou les vibrations) peuvent être convertis en tensions et affichés.

Les oscilloscopes affichent le changement d'un signal électrique au fil du temps, avec la tension et le temps comme axes Y et X, respectivement, sur une échelle calibrée. La forme d'onde peut ensuite être analysée pour des propriétés telles que l'amplitude, la fréquence, le temps de montée, l'intervalle de temps, la distorsion et autres. Les instruments numériques modernes peuvent calculer et afficher directement ces propriétés. À l'origine, le calcul de ces valeurs nécessitait de mesurer manuellement la forme d'onde par rapport aux échelles intégrées à l'écran de l'instrument.

Schémas du projet

Remarque : Assurez-vous que toutes les connexions de votre circuit sont exactement les mêmes que dans les schémas.

référence :

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

https://www.wikipedia.org/

Code

  • code
codeC/C++
/* (_20190212_OLEDoscilloscope.ino) 1285 octets de RAM gratuit 12/02/2019 */#include #include #include #include  // PROGMEM#include #define SCREEN_WIDTH 128 // Largeur d'affichage OLED#define SCREEN_HEIGHT 64 // Hauteur d'affichage OLED#define REC_LENGTH 200 // // Déclaration pour un affichage SSD1306 connecté à I2C (broches SDA, SCL) #define OLED_RESET -1 // Réinitialiser la broche # (ou -1 en cas de partage de la broche de réinitialisation Arduino) Affichage Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // char const vRangeName[10][5] PROGMEM ={"A50V", "Un 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; // booléen trigSync; // int att10x; // 1void setup() { pinMode(2, INPUT_PULLUP); // (int0 pinMode (8, INPUT_PULLUP); // Sélectionnez pinMode (9, INPUT_PULLUP); // Up pinMode (10, INPUT_PULLUP); // Down pinMode (11, INPUT_PULLUP); // Maintenez pinMode (12, INPUT); // 1/10 pinMode (13, OUTPUT); // // Serial.begin (115200); // RAM if (! display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Adresse 0x3C pour 128x64 // Serial. println(F("SSD1306 a échoué")); for (;;); // Ne continue pas, boucle indéfiniment } loadEEPROM(); // EEPROM analogReference(INTERNAL); // ADC1.1Vvref) attachInterrupt(0, pin2IRQ , TOMBER); // Écran de démarrage(); // }boucle vide() { digitalWrite(13, HIGH); setConditions(); // RAM40 readWave(); // (1,6 ms ) digitalWrite (13, LOW); // dataAnalize(); // (0,4-0,7 ms) writeCommonImage(); // (4.6ms) plotData(); // (5,4 ms+) dispInf(); // (6,2 ms) display.display(); // (37ms) saveEEPROM(); // EEPROM while (hold ==true) { // Hold dispHold(); retard(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; // Commutateur vScale (vRange) { // case 0 :{ // Auto50V // rangeMax =1023 ; // rangeMin =0; att10x =1 ; // Pause; } cas 1 :{ // Auto 5 V // rangeMax =1023 ; // rangeMin =0; att10x =0 ; // Pause; } cas 2:{ // 50V rangeMax =50 / lsb50V; // rangeMaxDisp =5000; // 100 rangeMin =0; rangeMinDisp =0 ; att10x =1 ; // Pause; } cas 3:{ // 20V rangeMax =20 / lsb50V; // rangeMaxDisp =2000; rangeMin =0 ; rangeMinDisp =0 ; att10x =1 ; // Pause; } cas 4:{ // 10V rangeMax =10 / lsb50V; // rangeMaxDisp =1000; rangeMin =0 ; rangeMinDisp =0 ; att10x =1 ; // Pause; } cas 5:{ // 5V rangeMax =5 / lsb5V; // rangeMaxDisp =500; rangeMin =0 ; rangeMinDisp =0 ; att10x =0 ; // Pause; } cas 6 :{ // 2V rangeMax =2 / lsb5V ; // rangeMaxDisp =200; rangeMin =0 ; rangeMinDisp =0 ; att10x =0 ; // Pause; } cas 7 :{ // 1V rangeMax =1 / lsb5V ; // rangeMaxDisp =100; rangeMin =0 ; rangeMinDisp =0 ; att10x =0 ; // Pause; } cas 8 :{ // 0,5 V rangeMax =0,5 / lsb5V ; // rangeMaxDisp =50; rangeMin =0 ; rangeMinDisp =0 ; att10x =0 ; // Pause; } cas 9 :{ // 0.5V rangeMax =0.2 / lsb5V ; // rangeMaxDisp =20; rangeMin =0 ; rangeMinDisp =0 ; att10x =0 ; // Pause; } }}void writeCommonImage() { // display.clearDisplay(); // (0,4 ms) display.setTextColor(WHITE); // display.setCursor(86, 0); // Commence dans le coin supérieur gauche display.println(F("av V")); // 1 display.drawFastVLine(26, 9, 55, BLANC); // display.drawFastVLine(127, 9, 55, BLANC); // display.drawFastHLine(24, 9, 7, BLANC); // Max display.drawFastHLine(24, 36, 2, WHITE); // display.drawFastHLine(24, 63, 7, BLANC); // display.drawFastHLine(51, 9, 3, WHITE); // Max display.drawFastHLine(51, 63, 3, WHITE); // display.drawFastHLine(76, 9, 3, WHITE); // Max display.drawFastHLine (76, 63, 3, WHITE); // display.drawFastHLine(101, 9, 3, WHITE); // Max display.drawFastHLine(101, 63, 3, WHITE); // display.drawFastHLine(123, 9, 5, WHITE); // Max display.drawFastHLine(123, 63, 5, WHITE); // for (int x =26; x <=128; x +=5) { display.drawFastHLine(x, 36, 2, WHITE); // () } pour (int x =(127 - 25); x> 30; x -=25) { pour (int y =10; y <63; y +=5) { display.drawFastVLine(x, y , 2, BLANC); // 3 } }} void readWave() { // if (att10x ==1) { // 1/10 pinMode (12, OUTPUT); // digitalWrite(12, LOW); // LOW } else { // pinMode(12, INPUT); // Commutateur Hi-z } (hRange) { // case 0 :{ // 50 ms timeExec =400 + 50 ; // (ms) EEPROM ADCSRA =ADCSRA &0xf8; // 3 ADCSRA =ADCSRA | 0x07 ; // 128 (arduino for (int i =0; i  dataMax) { // dataMax =d; } } // dataAve =(somme + 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 { // // } // pour (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 =faux ; // Désynchroniser }} 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("Penoscope")); display.display(); // retard (5000); display.clearDisplay(); display.setTextSize(1); // }void dispHold() { // Conserve display.fillRect(32, 12, 24, 8, BLACK); // 4 display.setCursor(32, 12); display.print(F("Maintenir")); // Maintien de display.display(); //}void dispInf() { // tension flottante ; // display.setCursor(2, 0); // display.print(vScale); // if (scopeP ==0) { // display.drawFastHLine (0, 7, 27, WHITE); // display.drawFastVLine(0, 5, 2, BLANC); display.drawFastVLine(26, 5, 2, BLANC); } // display.setCursor(34, 0); // display.print(hScale); // (heure/div) if (scopeP ==1) { // display.drawFastHLine(32, 7, 33, WHITE); // display.drawFastVLine(32, 5, 2, BLANC); display.drawFastVLine(64, 5, 2, BLANC); } // 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, BLANC); display.drawFastVLine(83, 5, 2, BLANC); } // if (att10x ==1) { // 10 voltage =dataAve * lsb50V / 10.0; // 50V } else { voltage =dataAve * lsb5V / 10.0; // 5V } dtostrf(tension, 4, 2, chrBuff); // x.xx display.setCursor(98, 0); // display.print(chrBuff); // // display.print(saveTimer); // // tension =rangeMaxDisp / 100.0; // Max if (vRange ==1 || vRange> 4) { // 5VAuto5V dtostrf(voltage, 4, 2, chrBuff); // *.** } else { // dtostrf(tension, 4, 1, chrBuff); // **.* } display.setCursor(0, 9); display.print(chrBuff); // Tension max =(rangeMaxDisp + rangeMinDisp) / 200,0 ; // if (vRange ==1 || vRange> 4) { // 5VAuto5V dtostrf(voltage, 4, 2, chrBuff); // 2 } else { // dtostrf(tension, 4, 1, chrBuff); // 1 } display.setCursor(0, 33); display.print(chrBuff); // tension =rangeMinDisp / 100.0; // Min if (vRange ==1 || vRange> 4) { // 5VAuto5V dtostrf(voltage, 4, 2, chrBuff); // 2 } else { dtostrf(tension, 4, 1, chrBuff); // 1 } display.setCursor(0, 57); display.print(chrBuff); // Min // if (trigSync ==false) { // display.setCursor (60, 55); // display.print(F("Unsync")); // Désynchroniser }}void plotData() { // long y1, y2; for (int x =0; x <=98; x++) { y1 =map(waveBuff[x + trigP - 50], rangeMin, rangeMax, 63, 9); // y1 =contrainte(y1, 9, 63); // y2 =map(waveBuff[x + trigP - 49], rangeMin, rangeMax, 63, 9); // y2 =contrainte(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, hPlage); 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; // } vPlage =x; x =EEPROM.read(1); // hPlage if ((x <0) || (x> 7)) { // 0-9 x =3; // } hPlage =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; // }}

Schémas


Processus de fabrication

  1. Fabriquer une machine à écrire pour les devoirs à la maison
  2. Console d'édition Photoshop DIY utilisant Arduino Nano RP 2040
  3. Comment faire de la fibre de carbone à partir de zéro à la maison
  4. Créer un moniteur Ambilight à l'aide d'Arduino
  5. Comment créer un bouton de clavier personnalisable personnalisable
  6. Comment mesurer la masse de la Terre à l'aide d'Arduino
  7. Comment créer un site web communiquant Arduino en utilisant PHP
  8. Comment faire de la musique avec un Arduino
  9. Comment faire une boussole en utilisant Arduino et Processing IDE