L'oscilloscope du pauvre !
Par MiGaNuTs, jeudi 16 février 2012 à 22:14 :: PIC et PIC et Colegram :: #194 :: rss
Ce qui va suivre est tres tres inspiré d'un tuto sympa dispo ici
petite video de mise en bouche :
K2008 + Pseudo oscillo en processing par MiGaNuTs
Bonne lecture de la suite.
le code de l'arduino
#include// necessaire pour pouvoir appeller une fonction toutes les x ms #define DEBUG1 // je sait plus a quoi ca sert :D //#define DEBUG2 // le mode debug 2 ecrit l'etat des 8 leds en binaire sur le port serie //#define DEBUG3 // le mode debug 3 ecrit la tension du flash sur le port serie const int led=13;// led de visualisation du temps passé dans l'interruption, pour l'oscillo. volatile int tensionflash = 0; // definie en tps que globale pour pas declancher les thyristors // si pas de jus const int pattetension = A0; const int pattepwm = 9; // patte 9 ou 10 car ca permets de changer le frequence du pwm sans mettre le dawa // dans les timings de l'interruption ni dans la fonction delay (enfin, normalement. a tester a l'oscillo) void setup() { pinMode(led, OUTPUT); pinMode(pattepwm, OUTPUT); /*Pins 9 and 10: Setting Divisor Frequency 0x01 1 31250 0x02 8 3906.25 0x03 64 488.28125 0x04 256 122.0703125 0x05 1024 30.517578125 TCCR1B = TCCR1B & 0b11111000 | ; */ TCCR1B = TCCR1B & 0b11111000|0x01; MsTimer2::set(1, InterruptTimer2); // appelle l'interruption toutes les x ms MsTimer2::start(); // active Timer 2 #if defined(DEBUG1) || defined (DEBUG2) || defined (DEBUG3) || defined (DEBUG4) || defined (DEBUG5) Serial.begin(115200); // pour debug via l'usb #endif } void loop (){ unsigned int machin=0; while (1){ machin=analogRead(pattetension); Serial.print(machin,DEC); Serial.print("\n"); if ((machin<50)||(machin>595)) {delay (12);} // reduit le debit des trucs sur le port serie delay (3); } } void InterruptTimer2() { const int seuiltension = 600; // consigne de tension de charge des condos // 800 : 383v sur les condos, 3,9v sur l'entrée // 400 : 191 v et 1,96v sur l'entrée // 700 : 338 et 3,42 // 600 : 290 et 2,93 const int seuiltensionmini=350; // tension de "softstart" const int pwnmini=100; // ratio de softstart const int pwnregul= 175; // il faut environ 10 us pour couper le courant dans la transfo. // la periode du pwm est de 32 us (environ) // (255/32)*(32-10) = 175,3 const int pwnmaxi = 180; // ratio utilisé dans la phase on l'on "booste" la charge a la barbare :D int ratiopwm; digitalWrite(led, HIGH); //on allume la led pour montrer qu'on est dans la boucle d'interruption tensionflash=analogRead(pattetension); if (tensionflash seuiltension) { //coupure de la charge analogWrite(pattepwm,0);digitalWrite(led,LOW); return; } analogWrite(pattepwm,pwnregul); digitalWrite(led,LOW); // on coupe la led pour montrer qu'on a rendu la main. // nickel pour un debug a l'oscilloscope }
Le code processing coté mac
// Programme processing // généré avec le générateur de code Processing // X. HINAULT - Janvier 2011 - tous droits réservés /////////////// Description du programme //////////// // Utilise le port Serie // Utilise une police texte /////////////// ENTETE DECLARATIVE //////////// // inclusion des librairies utilisées import processing.serial.*; // importe la librairie série processing // déclaration objets // --- port Série --- Serial myPort; // Création objet désignant le port série // --- police texte --- PFont fontA; // crée un objet de police texte // déclaration variables globales int xPos = 1; // variable abscisse - x int xPos0=1; // variable mémorisation xPos n-1 float yPos=1; // variable yPos - ordonnée float yPos0=1; // variable yPos n-1 int xTextPos=50; // variable position texte dans la fenêtre int yTextPos=50; /////////////// Fonction SETUP //////////// void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage // ---- initialisation paramètres graphiques utilisés colorMode(RGB, 255,255,255); // fixe format couleur R G B pour fill, stroke, etc... fill(0,0,255); // couleur remplissage RGB stroke (0,255,0); // couleur pourtour RGB strokeWeight(1); // largeur du trait en pixels rectMode(CORNER); // origine rectangle coin sup gauche // --- initialisation fenêtre de base --- //size(200, 200); // ouvre une fenêtre xpixels x ypixels size(int(screen.width*0.65), int(screen.height*0.6)); // 90% de l'écran par défaut - régler au besoin - // viser taille maxi en hauteur - taille fenêtre (x,y) background(0,0,0); // fond fenetre en noir // --- initialisation des fonctionnalités utilisées --- //------------- initialisation de la police texte - à mettre avant série ---- fontA = loadFont("HoboStd-20.vlw"); // charge le fichier police dans l'objet police texte // ce fichier doit être présent dans un rép dans le répertoire du programme // pour générer un fichier de police à partir des polices système aller dans Tools > create Fonts // voir également http://processing.org/learning/text/ textFont(fontA, 20); // Initialise la police et sa taille (en pixels) //------------- initialisation port série ---- println(Serial.list()); // affiche dans la console la liste des ports séries //myPort = new Serial(this, Serial.list()[1], 115200); // Initialise une nouvelle instance du port Série myPort = new Serial(this, "/dev/cu.usbmodem1d11", 115200); // Initialise une nouvelle instance du port Série myPort.bufferUntil('\n'); // attendre arrivée d'un saut de ligne pour générer évènement série //------- tracé initial --------- //traceInitial(); } // fin fonction Setup /////////////// Fonction Draw //////////// void draw() { // fonction exécutée en boucle // while(true); // stoppe boucle draw } // fin de la fonction draw() /////////////// Autres Fonctions //////////// //------------- Fonction de gestion des évènements série ---- void serialEvent (Serial myPort) { // fonction appelée lors de la survenue d'un évènement série // ******** Gestion de la valeur reçue sur le port série : ********** String inString = myPort.readStringUntil('\n'); // chaine stockant la chaîne reçue sur le port Série // saut de ligne en marque de fin if (inString != null) { // si la chaine recue n'est pas vide inString = trim(inString); // enlève espace blancs de la chaine recue int inByte_brut=int(inString); // conversion valeur reçue en valeur numérique entiere float inByte = float(inString); // conversion valeur reçue en valeur numérique décimale // ré-échelonne la valeur pour affichage inByte = map(inByte, 0, 1023, 0, height); yPos=inByte; // l'ordonnée est la valeur reçue par le port série //********** affichage numérique de la valeur reçue et autres calculs ***** //---- calcul de la tension à afficher -------- float tension=float(inByte_brut); tension=tension*5000; tension=tension/1023; // dessin d'un rectangle sous le texte avant affichage pour effacer texte précédent fill(0,0,0); // couleur de remplissage idem fond stroke(255,0,0); // fixe la couleur utilisée pour le tracé en RVB rect(40, 20, 200, 50); // Use fill() to change the value or color of the text fill(255,0,0); text(" ", xTextPos, yTextPos); //efface la valeur précédente //text(inByte_brut, xTextPos, yTextPos); text(inString+" Pts", xTextPos, yTextPos); //*********** gestion du graphique ********* // trace la ligne stroke (0,0,0); strokeWeight(1); rect (xPos0,0,3,height); stroke(0,255,255); // fixe la couleur utilisée pour le tracé en RVB strokeWeight(2); // largeur du trait en pixels line (xPos0,height-yPos0,xPos,height-yPos); // trace une ligne en tenant compte valeur reçue xPos0=xPos; // mémorisation xPos n-1 yPos0=yPos; // mémorisation xPos n-1 // à la fin de l'écran revient au début if (xPos >= width) { xPos = 0; xPos0=0; // pour retour de la trace sans ligne //background(0,0,0); // couleur du fond //------- tracé initial --------- //traceInitial(); } // fin RAZ graphique else { // incrémente la position horizontale (abscisse) xPos++; } } // fin condition chaine recue pas vide } // fin de la fonction de gestion des évènements Série // ----- mémo fonctions processing -------
Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.