Aller au contenu


Photo
- - - - -

Ash, Self balancing robot

Raspberry PI 2B Arduino UNO PID OpenBeam USB equilibre balancing

140 réponses à ce sujet

#41 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 327 messages
  • Gender:Male
  • Location:Paris

Posté 08 mars 2016 - 11:54

Je cherche à utiliser l'arduino alimenté en 5V.

 

Via l'usb, j'ai peur que le PI soit un peu chargé entre le hat (matrice de led, IMU), le dongle usb wifi et maintenant l'arduino.

 

Via le pin 5V ?

Par exemple :

arduino_no_computer_power.jpg

 

http://forum.arduino.cc/index.php?topic=258080.0

 

On est après la diode de protection du régulateur de tension 6-12V vers 5V. Donc gaffe à la polarité.

Et je lis que l'alimentation doit être régulée. Là, on alimente directement le microcontroleur. Donc pas de surtension.

 

On avance ^^ Merci


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#42 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 327 messages
  • Gender:Male
  • Location:Paris

Posté 10 mars 2016 - 12:04

J'ai trouvé un truc intéressant pour communiquer avec l'arduino depuis le pi.
On installe un sketch une fois pour toutes depuis un ordi.
Et branché au pi via usb, on le pilote depuis le pi en python.

C'est nanpy https://github.com/n...ster/README.rst

Quelqu'un connait ?

 

 

[EDIT] Finalement, j'ai mieux plus bas : le Makefile.


Modifié par Path, 16 mars 2016 - 11:16 .

Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#43 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 327 messages
  • Gender:Male
  • Location:Paris

Posté 12 mars 2016 - 12:30

Arduino reçu, capteur ultrason reçu.

 

1ers essais, c'est une belle découverte cet arduino !! Encore un hello world et un gros kiffe dans ce monde des robots !!

 

 

IMG_2475.jpg

int trig = 12; 
int echo = 11; 
long lecture_echo; 
long cm;

int led = 9;
int brightness = 0;

void setup() 
{ 
  pinMode(trig, OUTPUT); 
  digitalWrite(trig, LOW); 
  pinMode(echo, INPUT); 
  Serial.begin(9600);

  pinMode(led, OUTPUT);
}

void loop() 
{ 
  // Signal de commande
  digitalWrite(trig, HIGH); 
  delayMicroseconds(10); 
  digitalWrite(trig, LOW);
  // lecture de la durée
  lecture_echo = pulseIn(echo, HIGH);
  // Calcul de la distance en cm
  cm = lecture_echo / 58; 

  // brillance de la led entre 10 et 35 cm
  if(cm >= 10 && cm <= 35) {
    brightness = (cm - 10)*10;
  }
  else {
    if(cm < 10) {
      brightness = 0;
    }
    else {
      brightness = 255;
    }
  }
  analogWrite(led, brightness);

  Serial.print("Distance : "); 
  Serial.print(cm);
  Serial.print(" cm -  Brightness : ");
  Serial.println(brightness);
  delay(100); 
}


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#44 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 327 messages
  • Gender:Male
  • Location:Paris

Posté 14 mars 2016 - 12:08

Ce petit schéma logique pour partager ce que j'ai en tête. En espérant que c'est plus clair.

 

Le PI pour capturer l'inclinaison, calculer la direction et la vitesse des moteurs.

Il expose sur le wifi (AP) un serveur web / websocket pour l'interface.

Il commande l'affichage des LEDs

Il pilote aussi son nouveau pote Duino et reçoit les infos de distance.

 

Le Duino sert d'extention pwm et est plus doué pour le calcul de la distance (temps-réel).

Il est chargé de scruter l'horizon par secteurs d'angle à définir.

Il positionne la tête, calcul la distance.

Il envoi les couple (distance, secteur) au PI via Serial.

 

Pour finir sur les news, j'ai commandé des moteurs avec encodeurs et des roues plates  ;)

 

cablagev1.0.png


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#45 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 580 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 14 mars 2016 - 03:16

l'arduino pourrait / devrait être lié au driver de moteur ... Elle permet de faire un " vrai pwm" et tu ne devrais plus avoir besoin de jouer sur la " fréquence" .


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#46 yamovince

yamovince

    Habitué

  • Membres
  • PipPip
  • 238 messages

Posté 14 mars 2016 - 02:17

Sympa ton Ash, merci de partager tes aventures ;)



#47 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 327 messages
  • Gender:Male
  • Location:Paris

Posté 16 mars 2016 - 12:07

De rien Yamovince. Merci à toi aussi :)

 

@Mike,

Je vais refaire un test en faisant varier la fréquence sur l'arduino ;) C'est certain.

 

Quant à déplacer le pilotage des moteurs sur l'arduino,

 

Dans la doc du senseur de distance (http://www.robotshop.com/media/files/PDF/datasheet-sen026.pdf), on lit que la séquence de mesure prend environ 50ms. C'est le max. s'il n'y a pas d'obstacle.

 

Donc, si j'ajoute la commande des moteurs dans la boucle du Duino, cela veut dire que pendant un demi 10e de sec, je peux pas commander les moteurs ... Cela semble acceptable ;)

 

Si je résume les responsabilités confiées à l'arduino :

  • Mesure de distance :
    • lire l'angle sur Serial (USB)
    • écrire la valeur pwm
    • attente de positionnement du servo (durée fixe à définir)
    • écriture du signal TRIG (10us synchrone)
    • Lecture du signal ECHO : attendre mesure de distance (max 50ms synchrone)
    • calculer la distance
    • écrire la distance sur Serial (USB)
  • Contrôle des moteurs :
    • lire directionA, vitesseA, directionB, vitesseB sur Serial (USB)
    • écriture des valeurs digitales et PWM sur les 4 sorties.

 

A part la mesure de distance elle-même, la séquence de mesure sera faite de manière asynchrone dans la boucle. Les attentes du placement du servo ne seront pas bloquantes.

 

Je vous tiens au courant.

 

cablagev1.1.png


Modifié par Path, 09 mai 2016 - 11:42 .

Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#48 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 327 messages
  • Gender:Male
  • Location:Paris

Posté 16 mars 2016 - 11:01

Ce soir, branchement du PI et son pote Duino !!

Les 2 sont reliés en USB. Ils sont isolés du reste du robot. Le PI alimente l'arduino via USB.

 

Au programme ce soir :

  • Upload sur arduino directement depuis le PI en ligne de commande.
  • Communication entre les 2 via USB.

Je kiffe, je partage. Parce que je ne dois pas être le seul que cela embête de débrancher re-brancher ce câble USB ...

 

tutoPiDuinoUpload.png

 

 

Compilation et Upload

 

Pour modifier le sketch via ssh, depuis le PI vers l'arduino, sans passer par l'interface graphique (IDE)  :

 

(Préalable) Il faut installer 2 packages sur le PI :

sudo apt-get install arduino-core arduino-mk

Autoriser le user (pi) à utiliser les commandes arduino :

sudo usermod -a -G dialout pi

Pour chaque programme à uploader :

 

Il faut un répertoire dédié pour ces 2 fichiers : code.ino et le Makefile.

 

Code.ino (le nom importe peu mais l'extension doit être .ino) contient le code source arduino. On peut l'éditer via son éditeur de texte préféré, via ssh, via vi si on veut.

 

Makefile indique aux commandes arduino quelques paramètres. Il doit contenir ces lignes :

ARDUINO_DIR = /usr/share/arduino
BOARD_TAG = uno
ARDUINO_PORT = /dev/ttyACM*
ARDUINO_LIBS =
include /usr/share/arduino/Arduino.mk

Mon arduino est un uno , cela tombe bien. Je crois qu'il faut changer 'BOARD_TAG' si ce n'est pas le cas.

 

Pour Ash, sur le PI, cela donne :

pi@raspberrypi:~/SBR/arduino $ ls -la
total 20
drwxr-xr-x 3 pi pi 4096 mars  16 21:49 .
drwxr-xr-x 5 pi pi 4096 mars  16 21:47 ..
drwxr-xr-x 3 pi pi 4096 mars  16 21:49 build-uno
-rw-r--r-- 1 pi pi  133 mars  16 21:48 Makefile
-rw-r--r-- 1 pi pi  532 mars  16 21:47 sbr.ino

NB. le répertoire build-uno est créé par le compilateur.

 

Compiler et uploader :

 

Pour compiler, il faut se mettre dans le répertoire qui contient le .ino et le Makefile.

Lancer la commande make :

pi@raspberrypi:~/SBR/arduino $ vi sbr.ino 
pi@raspberrypi:~/SBR/arduino $ make

Spoiler

Cela semble compiler ^^

 

Pour uploader, toujours dans le même répertoire, lancer make upload.

pi@raspberrypi:~/SBR/arduino $ make upload

Spoiler

I thank you too Mr Duino.

 

 

 

Communication entre Mr PI et Mr Duino via USB

 

Maintenant, toujours sans débrancher la prise USB entre le PI et le Duino, ils se parlent !

 

Préalable sur le raspberry

 

Il faut installer Serial pour python.

sudo apt-get install python-serial

Préalable sur arduino : rien.

 

Programme de test PI (en python)

#!/usr/bin/python
# -*- coding: utf-8 -*-


import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600)

while 1 :
	message = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
	ser.write(message)
	print(ser.readline())
	time.sleep(0.5)

Programme de test arduino :

int compteur = 0;
String message;

void setup(){
  Serial.begin(9600);
}


void loop() {
  message = "-";
  if (Serial.available())  {
    message = Serial.readString();
  }
  Serial.print("MSG # ");
  Serial.print(compteur);
  Serial.print(" read : ");
  Serial.println(message);

  compteur++;
  delay(1000);
}

Le PI envoi la date.

Le Duino lit cette date, ajoute une donnée et retourne la texte modifié.

Le PI affiche ce que Duino lui envoi.

pi@raspberrypi:~/SBR $ ./test-serial-rpi.py 
Wed, 16 MSG # 0 read : -

MSG # 1 read : Wed, 16 Mar 2016 21:30:21 +0000

MSG # 2 read : Wed, 16 Mar 2016 21:30:23 +0000

MSG # 3 read : Wed, 16 Mar 2016 21:30:25 +0000

MSG # 4 read : Wed, 16 Mar 2016 21:30:27 +0000

MSG # 5 read : Wed, 16 Mar 2016 21:30:29 +0000

Au passage, on note qu'il manque une seconde sur 2. La lecture étant bloquante en python sur le PI, il attend que le Duino réponde (1s) pour envoyer la prochaine date.


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#49 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 087 messages
  • Gender:Male
  • Location:Autriche

Posté 17 mars 2016 - 12:10

Super ! Merci pour le partage !

N'hésite pas à copier/coller tout ça dans un tutoriel (http://www.robot-maker.com/forum/tutorials/) pour qu'il ne se perde pas dans les posts sur ton projet ! Comme ça, la prochaine fois que quelqu'un cherche l'info, on pourra lui envoyer un lien utile. :)

Et si un jour tu fais tourner ROS sur ta RaspBerry, il existe un package qui fait la surcouche de cette communication pour utiliser les topics de ROS : http://wiki.ros.org/rosserial
R1D1 - Calculo Sed Ergo Sum -- en ce moment, Projet Ballista
Avatar tiré du site bottlebot

#50 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 580 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 17 mars 2016 - 12:14

 

Au passage, on note qu'il manque une seconde sur 2. La lecture étant bloquante en python sur le PI, il attend que le Duino réponde (1s) pour envoyer la prochaine date.

 

Augmente ton baude rate de communication et fait disparaitre ce " delay de 1 s " de ta boucle loop dans arduino ;)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#51 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 327 messages
  • Gender:Male
  • Location:Paris

Posté 17 mars 2016 - 10:49

Merci !!

Je ne connaissais pas ROS. Très intéressant. Pas certain que Ash en soit équipé. Mais je vais peut-être m'en inspirer. Il me manque encore une sérialisation et une analyse des messages échangés. Je comptais faire ça from scratch. Merci du partage.

 

@Mike, merci aussi.

Le delay va disparaître. Le Duino étant mono-tâche, c'est useless ;) C'est là pour, l'illustration.

Et, au final, pour Ash, la lecture du port USB sera faite par nodejs, pas en python.

 

J'ai séparé le post en 2 tutos.

 

Au passage, je crois énormément en nodejs. Je pratique cette techno dans la vie pro et elle sert beaucoup dans le monde des objets connectés entre autres choses. Elle a le mérite d'être très performante et assez simple, de fonctionner sur raspberry et d'ouvrir le robot au reste du monde avec des protocoles standardisés. Je ne m'étend pas dessus jusque là mais je pourrai si vous pensez que c'est utile ici.


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#52 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 087 messages
  • Gender:Male
  • Location:Autriche

Posté 17 mars 2016 - 01:10

Au passage, je crois énormément en nodejs. Je pratique cette techno dans la vie pro et elle sert beaucoup dans le monde des objets connectés entre autres choses. Elle a le mérite d'être très performante et assez simple, de fonctionner sur raspberry et d'ouvrir le robot au reste du monde avec des protocoles standardisés. Je ne m'étend pas dessus jusque là mais je pourrai si vous pensez que c'est utile ici.


Je valide les tutos :)
Vu que tu es sur Paris, tu as dû entendre parler des Nodebots Paris http://www.meetup.com/Nodebots-Paris/?
R1D1 - Calculo Sed Ergo Sum -- en ce moment, Projet Ballista
Avatar tiré du site bottlebot

#53 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 327 messages
  • Gender:Male
  • Location:Paris

Posté 17 mars 2016 - 01:27

Je connais bien meetup ^^ J'ai beaucoup participé à ceux qui tournent autour des méthodes de développement en info.

Hop inscrit à celui-là :)


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#54 yamovince

yamovince

    Habitué

  • Membres
  • PipPip
  • 238 messages

Posté 18 mars 2016 - 05:32

Incroyable ca, du JS dans un robot. Merci pour l'info ;)

et Raspberry + Arduino ca promet



#55 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 580 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 19 mars 2016 - 12:21

 

Au passage, je crois énormément en nodejs. Je pratique cette techno dans la vie pro et elle sert beaucoup dans le monde des objets connectés entre autres choses. Elle a le mérite d'être très performante et assez simple, de fonctionner sur raspberry et d'ouvrir le robot au reste du monde avec des protocoles standardisés. Je ne m'étend pas dessus jusque là mais je pourrai si vous pensez que c'est utile ici.

 

Moi ça m'intéresse pas mal =) ! ( les trucs que je ne connais pas ça m'intéresse toujours ;) par contre tu peux éventuellement le faire dans un autre sujet ;) )


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#56 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 327 messages
  • Gender:Male
  • Location:Paris

Posté 21 mars 2016 - 12:30

Promis, je mettrai des tutos pour nodejs sur raspberry.

 

En attendant, j'ai reçu les encodeurs pour les moteurs. Je cherche pour voir comment m'en servir sur le uno que je découvre encore.

 

0J6848.1200.jpg

https://www.pololu.com/product/2826

 

Je trouve des exemples avec des mecs qui mesurent la période du signal. Pourquoi pas.

De mon coté, je pense compter les fronts. Je trouve ça plus simple.

 

Il s'agit d'incrémenter ou décrémenter un long selon la direction. Cela pour les 2 moteurs.

NB. avec un int, je ne pourrai compter que 5 tours de roue dans les 2 directions.

 

Le code de l'interruption sera très court. Du genre :

if(directionDuMoteur == 0) {
  compteur ++;
  if(compteur >= seuil) {
    Serial.print("BLABLA");
  }
}
else { // directionDuMoteur == 1
  compteur --;
  if(compteur <= seuil) {
    Serial.print("BLIBLI");
  }
}

- Par exemple compter pour déterminer la distance parcourue sur un interval de temps donné. (Plus grand que la période du signal en tout cas.)

- Ou bien compter jusqu'à une certaine valeur. Au besoin.

 

 

 

1. Interruptions à 10,9 kHz

 

Après, je pense utiliser les interruptions du uno pour compter ces ticks. (en fait je vois pas comment faire autrement)

 

J'ai des moteurs qui au max tournent à 100 tours/min

L'encodeur tick 6533 fois par tours.

Soit au max 10888,3 ticks par sec.

 

Pour avancer tout droit, je pourrai n'utiliser qu'un seul encodeur sur les 2.

Pour tourner, je serai obligé d'utiliser les 2.

 

Le père Duino avec ses 16 MHz pourra déclencher 2 interruptions à cette fréquence. J'en suis persuadé. De votre expérience du uno, c'est raisonnable ? Je ne me rend pas compte.

 

... Je sens revenir de vieux souvenirs de bascules D ou JK ... Dîtes-moi que j'en aurai pas besoin :D

 

 

 

2. Interruptions et mesure de temps (pour la distance)

 

Pour la mesure de temps, je dois être précis. Je pense utiliser une séquence noInterrupts(). Mais c'est incompatible avec le comptage des encodeurs. A cette fréquence, j'ai un tick d'encodeur toutes les 90 us environ et la mesure dure 50 ms ...

 

Soit je n'utilise pas noInterrupts() et je perd en précision sur la mesure de distance.

Soit je l'utilise et je perd en précision sur la distance parcourue.

 

Comme on parle de perdre 50 ms de compteurs à 90 us, cela fait perdre 555 ticks soit environ un 1/11 tour.

Avec des roues de périmètre 22 cm, je perds 2 cm pendant une mesure si je suis à pleine vitesse.

 

Je serai jamais à pleine vitesse pour faire une mesure ^^

 

Vous avez un avis sur la question ?

 

 

 

Merci d'avance de vos remarques.

 

PS. c'est passionnant. Merci encore pour m'avoir guidé vers ces encodeurs !!

:kez_05:


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#57 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 580 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 21 mars 2016 - 01:31

Alors : 

1) pas de serialprint dans ton interruption => le but c'est d'avoir l'interruption la plus courte 
2) 2 méthode possible : Utiliser des interruption sur les changements de pin typiquement sur les pin 2 et 3 ou interruption sur timer tous les x temps en espérant qu'au moins la moitié du temps rien n'aura changer pour ne pas perdre de ticks...
3) Il est possible soit d'ajouter un composant électronique en plus ( XOR ) pour améliorer la résolution par 2 avec la méthode de l'interruption sur changement de pin en sacrifiant 2 pins de plus dans le cas de l'usage d'encoders en quadrature ,  soit en utilisant une librairie qui permet d'avoir plus d'interruption, ...

4) Il existe aussi des composants en SPI qui gèrent les encodeurs mais je trouve formateur d'apprendre à les utiliser. 

Perso je préfère utiliser les interruption sur changement de pin ...  

a) regarde comment fonctionne les interruptions sur changement d'états sur les pin 2 et 3  
b ) regarde comment étendre cette fonctionnalité sur plus de port ( au moins 2 de plus ;)
c) regarde comment fonctionne les encodeurs en quadrature ( car visiblement c'est ce que tu as ;)  ) 

 

petit indice : 

post-5864-0-45909300-1458518664.png

 

 

du coups tu en déduiras que dans interruption si tu veux aussi bien gérer le sens et le compte dans ton interruption il te faudra seulement faire un :

 

if ( A xor PreviousB ) count ++ else count--
sans oublier PreviousB = B  juste après ...

d) afin d'aller encore plus vite dans l'interruption il est interessant de privilégier une lecture sur le même port du micro-controleur ( on tombe alors dans l'architecture même du micro contrôleur qui constitue l'arduino et on découvre des truc géniaux : 
 

DDRD=B00000010;  // On met tout le port D en entrée sauf TX à exécuter une seule fois dans le setup par exemple
byte state = PIND ; // permet d'enregistre l'état de tout le port D en une fois ( les pins 0 1 2 3 4 5 6 et 7 de l'arduino uno ) 

=> exit le digital Read qui prend 3 plombe d'éxecution ...

Et du coup le opérations bit à bit qui sont si rapide à éxécuter deviennent des truc géniaux : 

#define pinA  x  // x de 0 à 7 , mais on évitera 0 et 1 (RX et TX)
#define pinB y   // y différent de x de 0 à 7 mais on évitera 0 et 1  (RX et TX)

byte state=0 ;
bool A=0; 
bool B=0;
bool previousB=0;
long count=0;

void interruptOnChange()        // fonction qui se déclanche en cas d'interruption sur les pinA et pinB
{
state = PIND;                   // On lit le port complet

A=(state&(1<<pinA))>>pinA);     // on récupère A
B=(state&(1<<pinB))>>pinB);     // on récupère B
(A^previousB)?count++:count--;  // on définit dans quel sens on doit compter et on opère c'est équivalent au if else classique plus haut mais je trouve ça plus joli ;)

// possible de faire encore plus barbare en une fois :( (state&(1<<pinA))>>pinA)^(state&(1<<pinB))>>pinB) )?count++:count--;

previousB=B;                    // on oublis pas d'enregistrer la donné de B dans previousB pour le prochain calcul
}

J'avais pour objectif de fournir un tutoriel sur les différentes façon d'utiliser les encodeurs ...  Mais faute de temps ça avance pas ... Difficile de faire la sélection des produits , faire avancer la boutique en ligne , continuer le boulot et tout les autres projets ! =/

Du coup je donne un petit morceau du tuto que j'aurais aimé fournir ici =) 

Bref je te laisse faire la suite si je fais tout le code ... tu vas t'ennuyer après ... Bonne continuation ;) Et si j'ai pas été assez claire sur un point n'hésite pas à poser des questions ;)

 

 

Promis, je mettrai des tutos pour nodejs sur raspberry.

 

Je suis curieux de découvrir ce que c'est je ne connais pas nodejs et j'ai même pas encore fait de recherche sur le net pour savoir ce que c'est et à quoi ça sert !


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#58 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 327 messages
  • Gender:Male
  • Location:Paris

Posté 21 mars 2016 - 08:41

Excellent, mortel, j'adore !! C'est exactement ça que je cherche ;) ça c'est de l'embarqué !! ça me rappel l'époque où on comptait les octets pour programmer.

 

Plus de Serial dans l'interruption !! Noté.

 

PIND <-- Merci pour l'astuce.

 

Ne peut-on pas aller encore plus vite dans l'interruption en pré-calculant le masque pinA et celui de pinB ?

byte maskA = 1<<pinA

 

Merci encore.

 

 

 

 

Edit, petit lien en support :

http://eskimon.fr/1628-arduino-mini-tuto-les-ports


Modifié par Path, 21 mars 2016 - 10:58 .

Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#59 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 580 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 21 mars 2016 - 09:47

 

 

Ne peut-on pas aller encore plus vite dans l'interruption en pré-calculant le masque pinA et celui de pinB ?

byte maskA = 1<<pinA

 

 

Si bien entendu ;) et mieux encore avec un #define ;) 

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#60 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 327 messages
  • Gender:Male
  • Location:Paris

Posté 22 mars 2016 - 01:15

J'ai cherché les interruptions sur les pin 2 et 3, appelées "External".

J'ai trouvé aussi les interruptions "Pin change" applicable aux autres pins.

Mais j'ai lu aussi que les externals sont de type hardware donc beaucoup plus rapide.

 

Et je me suis dit, si je n'utilise que ces 2 interruptions pour être le plus rapide. Sur le A de chacun des moteurs. Et je me contente de lire le B sur chaque front montant du A pour lire le sens. Ca me fait une interruption super courte.

 

Vu le graph des sorties :

0J2643.600.jpg?954dd7f1ce65b04b95900587e

volatile long counterLeft = 0;
volatile long counterRight = 0;

// moteur gauche
// pin channel A : 2 (interrupt)
// pin channel B : 4
void interruptOnRaising2() {
  (PIND&B00010000)?counterLeft++:counterLeft--;
}
// moteur droit
// pin channel A : 3 (interrupt)
// pin channel B : 5
void interruptOnRaising3() {
  (PIND&B00100000)?counterRight++:counterRight--;
}

C'est déconnant ?

Qu'en penses-tu ?


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 




Répondre à ce sujet



  



0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users