Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.83 KB | None | 0 0
  1. /*
  2.  * questo programma deriva da
  3.  * file:///home/giorgio/Dropbox/ProgettiStrutturati/Esoscheletro/ReactionWheel/Software/SingleReactionWheelImu/SingleReactionWheelImu.ino
  4.  * da cui ha preso le inizializzazioni dei pin e il setup, ed è il motivo per cui in questo header ci sono cose potenzialmente
  5.  * non utlizzate nel resto del programma ma è solo un software di parametrizzazione quindi non è di produzione
  6.  * va bene così
  7.  * Un altra fonte da cui sono state presi dei pezzi di codice relativi alla comunicazione seriale è:
  8.  * file:///home/giorgio/Dropbox/ProgettiStrutturati/Esoscheletro/invio_ricezione_seriale/arduino-py-01/arduino-py-01.ino
  9.  *
  10.  *
  11.  * L'obiettivo di questo software è capire in dettaglio il comportamento del motore con attaccata su la ruota di reazione
  12. * il gruppo motore/ruota è quello identificato da RW2 (ReactioWheel #2)
  13. *
  14. * Uno script python trasferità via seriale il valore pwm, arduino eseguirà il comando e ritornerà un valore medio
  15. * della velocità del motore.
  16. * L'idea è quella di avere un dataset completo di velocità-pwm
  17.  * Successivamente il sistema di potrà estendere a accelerazioni-tempo in modo da avre i dati alla prima derivata
  18.  * Calcolare il momento angolare e la forza risultante con tanta tanta fortuna
  19.  *
  20.  */
  21.  
  22. //definisco gli input per pilotare il motore
  23. //2a e 2b danno la direzione motorPWM da il valore del pwm di uscita
  24. #define motor2A   8
  25. #define motor2B   7
  26. #define motorPWM  9
  27. //questo è il pin dove è attaccato il sensore orrico di RW2
  28. #define RW2 2
  29.  
  30. //variabili per il calcolo della velocità usate nella funziona di interrupt
  31. volatile int holesRW2 = 0;
  32. int InterruptForCompleteTurn = 24;
  33.  
  34. //*******************  FUNZIONE CALLBACK PER L'INTERRUPT ****************************
  35. //***********************************************************************************
  36. //ad ogni cambio di stato del pin incrementa di 1 la variabile che conta i fori
  37. void PassageRW2() {
  38.  holesRW2 = holesRW2 + 1;
  39. }
  40.  
  41.  
  42. void setup() {
  43.  // put your setup code here, to run once:
  44.  Serial.begin(115200);
  45.  Serial.flush();
  46.  
  47.  //faccio un giochino di luci per identificare il fatto che il sistema è pronto e per
  48.  //iniziliazzare l'output 13
  49.   pinMode(13, OUTPUT);
  50.   for(int i=0; i<100; i++) {
  51.   digitalWrite(13, HIGH);
  52.   delay(20);
  53.   digitalWrite(13, LOW);
  54.   delay(20);
  55.   }
  56.   digitalWrite(13, HIGH);
  57.   delay(1000);
  58.  
  59.   //setto i pin relativi per controllare la direzione del motore
  60.   pinMode(motor2A, OUTPUT);
  61.   pinMode(motor2B, OUTPUT);
  62.   //imposto che siano uno l'opposto dell'altro per farlo girare in una direzione qualsiasi
  63.   digitalWrite(motor2A, HIGH);
  64.   digitalWrite(motor2B, LOW);
  65.   //setto il pin per controllare l'enable del motore
  66.  pinMode(motorPWM, OUTPUT);
  67.  //una volta settato porto il pwm a 0 per fermare la rotazione, se sta girando durante un reset,
  68.  //do tempo di fermarsi o cmq di rallentare
  69.  analogWrite(motorPWM, 0);
  70.  //ed aspetto 3 secondi per farlo fermare
  71.  delay(3000);
  72.  analogWrite(motorPWM, 30);
  73.  digitalWrite(13, LOW);
  74.  
  75. //aggancio la funzione di loopback dell'interrupt per il conteggio dei fori
  76. attachInterrupt (digitalPinToInterrupt(RW2), PassageRW2, CHANGE);
  77. }
  78.  
  79. void loop() {
  80.   // put your main code here, to run repeatedly:
  81. //leggo i dati dalla seriale, per essere sicuro del funzionamento della lettura disabilito e riabilito gli interrupt
  82. int DatiRicevuti = ReadDataFromSerial();
  83.  
  84. //faccio partire il cronometro
  85. unsigned long int now = micros();
  86. //aspetto che la ruota faccia due giri ma mentre aspetto cmq leggo gli input per poter modificare
  87. //al volo la velocità
  88. while (holesRW2 < InterruptForCompleteTurn) { }
  89. unsigned long int RevolutionTime = micros()-now;
  90.  
  91.  
  92.  
  93. //se la funzione rileva che ci sono dati nella seriale diversi da zero
  94. ///imposta il valore del pwm a quel livello
  95. noInterrupts();
  96. if (DatiRicevuti > 0){
  97.   Serial.print("' valore contato: '");Serial.print(int(holesRW2));Serial.print(" tempo ='");Serial.print(String(RevolutionTime));Serial.print("' Imposto valore PWM a : '");Serial.println(String(DatiRicevuti));
  98.   analogWrite(motorPWM, DatiRicevuti);  
  99.   }
  100.  
  101. //se i dati sono ricevuti sono minori o uguali a zero resta in attesa e porta a 0 il pwm
  102. eser = serial.Serial('/dev/ttyUSB0', baudrate=115200)
  103.  
  104. print("azzero il pwm e aspetto 5 sec")
  105. ser.write(str.encode("0"))
  106. time.sleep(3)
  107. print("avvio")
  108.  
  109. while True:
  110.   for numero in range(50):
  111.     # leggi cosa torna indietro e stampalo
  112.  
  113.     # questa funzione invia il dato
  114.     ser.write(str.encode(str(numero + 20)))
  115.     #delay di 4 secondi
  116.     time.sleep(4)
  117.     #pulisco i buffer
  118.     ser.flushInput()
  119.     ser.flushOutput()
  120.     #menorizzo in una stringa leggo quello che arduino mi fa tornare indietro
  121.     ser_bytes = ser.readline()
  122.     #stampo la stringa
  123.     print("dati letto: %s"%ser_bytes)
  124.     #pulisco i buffer
  125.     ser.flushInput()
  126.     ser.flushOutput()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement