diff options
Diffstat (limited to 'OpenModelica-Arduino-MDD-Windows/tools/arduino-firmware/arduino-firmware.ino')
-rw-r--r-- | OpenModelica-Arduino-MDD-Windows/tools/arduino-firmware/arduino-firmware.ino | 795 |
1 files changed, 795 insertions, 0 deletions
diff --git a/OpenModelica-Arduino-MDD-Windows/tools/arduino-firmware/arduino-firmware.ino b/OpenModelica-Arduino-MDD-Windows/tools/arduino-firmware/arduino-firmware.ino new file mode 100644 index 0000000..8d10650 --- /dev/null +++ b/OpenModelica-Arduino-MDD-Windows/tools/arduino-firmware/arduino-firmware.ino @@ -0,0 +1,795 @@ + + /* This file is meant to be used with the SCILAB arduino + toolbox, however, it can be used from the IDE environment + (or any other serial terminal) by typing commands like: + + Conversion ascii -> number + 48->'0' ... 57->'9' 58->':' 59->';' 60->'<' 61->'=' 62->'>' 63->'?' 64->'@' + 65->'A' ... 90->'Z' 91->'[' 92->'\' 93->']' 94->'^' 95->'_' 96->'`' + 97->'a' ... 122->'z' + + Dan0 or Dan1 : attach digital pin n (ascii from 2 to b) to input (0) or output (1) + Drn : read digital value (0 or 1) on pin n (ascii from 2 to b) + Dwn0 or Dwn1 : write 1 or 0 on pin n + An : reads analog pin n (ascii from 0 to 19) + Wnm : write analog value m (ascii from 0 to 255) on pin n (ascii from 0 to 19) + Sa1 or Sa2 : Attach servo 1 (digital pin 9) or 2 (digital pin 10) + Sw1n or Sw2n : moves servo 1 or servo 2 to position n (from ascii(0) to ascii(180)) + Sd1 or Sd2 : Detach servo 1 or 2 + + Generic DC_Motor + Cijkl : setup for generic DCmotor number i (1 to 4), PW1 on pin number j, PWM2 or direction on pin number k, mode=l + l=0 for L293 (2 PWM) and l=1 for L298 (1PWM + 1 bit for direction) + Mijk : sets speed for generic DCmotor number i, j=0/1 for direction, k=ascii(0) .. ascii(255) + Mir : releases motor i (r=release) + + Generic Interrupt counter + Iai : activate counter on INT number i (i=ascii(2 or 3 or 18 or 19 or 20 or 21) + Iri : release counter on INT number i + Ipi : read counter on INT number i + Izi : reset counter on INT number i + + Generic Encoder + Eajkl: activate encoder on channelA on INT number j (j=ascii(2 or 3 or 18 or 19 or 20 or 21) et channelB on pin k or INT number k (k=ascii(0)..ascii(53)) + and l=1 or 2 or 4 for 1x mode (count every rising of chA) or 2x mode (count every change statement of chA) + or 4x mode (every change statement of chA et chB) + Eri : release encoder on INTi + Epi : read position of encoder on INTi + Ezi : reset value of encoder on INTi position + + R0 : sets analog reference to DEFAULT + R1 : sets analog reference to INTERNAL + R2 : sets analog reference to EXTERNAL + + */ + +#include <Servo.h> + +/* define internal for the MEGA as 1.1V (as as for the 328) */ +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define INTERNAL INTERNAL1V1 +#endif + +/* create and initialize servos */ +Servo servo1; +Servo servo2; + +/* Generic motors */ +int dcm1_pin1,dcm1_pin2,dcm1_mode; +int dcm2_pin1,dcm2_pin2,dcm2_mode; +int dcm3_pin1,dcm3_pin2,dcm3_mode; +int dcm4_pin1,dcm4_pin2,dcm4_mode; + +// Generic encoder +/* Encoders initialisation */ +// volatile declare as those variables will change in interrupts +volatile long int encoder_0_position = 0,encoder_1_position = 0, encoder_2_position = 0, encoder_3_position = 0, encoder_4_position = 0, encoder_5_position = 0; +int encoder_0_int2 ; // Pin used for encoder0 chanel B : define from scilab +int encoder_1_int2 ; // Pin used for encoder1 chanel B : define from scilab +int encoder_2_int2 ; // Pin used for encoder2 chanel B : define from scilab +int encoder_3_int2 ; // Pin used for encoder3 chanel B : define from scilab +int encoder_4_int2 ; // Pin used for encoder4 chanel B : define from scilab +int encoder_5_int2 ; // Pin used for encoder5 chanel B : define from scilab +int encoder_num, encoder_int2; +int corresp[6]={2,3,21,20,19,18}; //Correspondance beetween interrupt number and pin number + +//Generic counter +volatile long int counter_0=0,counter_1=0,counter_2=0,counter_3=0,counter_4=0,counter_5=0; + +int initiat=1; + +void setup() { + /* initialize serial */ + Serial.begin(115200); + +} +void loop() { + + + + /* variables declaration and initialization */ + + static int s = -1; /* state */ + static int pin = 13; /* generic pin number */ + static int dcm = 4; /* generic dc motor number */ + + int val = 0; /* generic value read from serial */ + int agv = 0; /* generic analog value */ + int dgv = 0; /* generic digital value */ + static int enc = 1; /* encoder number 1 (or 2 for Arduino mega) */ + + while (Serial.available()==0) {}; // Waiting char + val = Serial.read(); + + //Checking for availability of firmware + if(val==118) + { + delay(10); + Serial.write("ok"); + } + +// if (val==0){// version +// Serial.print('v3'); +// val=-1; +// } + //case A -> Analog + else if (val==65){//A -> Analog read + while (Serial.available()==0) {}; // Waiting char +// val=Serial.read(); +// if (val==114){ //'r'-> read pin +// while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val>47 && val<67) { //from pin 0, to pin 19 + pin=val-48; //number of the pin + agv=analogRead(pin); + //Serial.println(agv); + Serial.write((uint8_t*)&agv,2); /* send binary value via serial */ + } + val=-1; + } + else if (val==87){//W -> Analog write + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val>47 && val<67) { //from pin 0 to pin 19 + pin=val-48; //number of the pin + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + analogWrite(pin,val); + } + val=-1; + } + //} + + //case D -> Digital + else if (val==68){//D -> Digital pins + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val==97){ //'a'-> declare pin + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val>49 && val<102) { + pin=val-48; + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val==48 || val==49) { + if (val==48){//'0' -> input + pinMode(pin,INPUT); + } + else if (val==49){//'1' -> output + pinMode(pin,OUTPUT); + } + } + } + } + if (val==114){ //'r'-> read pin + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val>49 && val<102) { + pin=val-48; //number of the digital pin + dgv=digitalRead(pin); +// Serial.println(dgv); + Serial.print(dgv); + } + } + if (val==119){ //'w'-> write pin + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val>49 && val<102) { + pin=val-48; //number of the digital pin + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val==48 || val==49) { // 0 or 1 + dgv=val-48; + digitalWrite(pin,dgv); +// Serial.println(dgv); + } + } + } + val=-1; + + } + //case S -> servomotor + else if (val==83){ + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val==97){ //'a'-> declare servo + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val==49 || val==50) { //servo 1 or 2 + pin=val-48; //number of the servo + if (pin==1) { + servo1.attach(9); + servo1.write(0); +// agv=servo1.read(); +// Serial.println(agv); + } + if (pin==2) { + servo2.attach(10); + servo2.write(0); +// agv=servo2.read(); +// Serial.println(agv); + } + + } + } + if (val==100){ //'d'-> detach servo + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val==49 || val==50) { //servo 1 or 2 + pin=val-48; //number of the servo + if (pin==1) {servo1.detach(); } + if (pin==2) {servo2.detach(); } + } + } + if (val==119){ //'w'-> write pin + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val==49 || val==50) { //servo 1 or 2 + pin=val-48; //number of the servo + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val>=0 && val<=180){ + if (pin==1) { + servo1.write(val); +// agv=servo1.read(); +// Serial.println(agv); + } + if (pin==2) { + servo2.write(val); +// agv=servo2.read(); +// Serial.println(agv); + } + } + } + } + val=-1; + + } + + //case I -> Interrupt + else if (val==73){ + /* ASKING ACTIVATION OF AN COUNTER */ + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); + if (val==97) { //a = activation + while (Serial.available()==0) {}; // Waiting char + val=Serial.read(); // Read int_number (must be 0 or 1 on UNO / 1 to 5 on MEGA) : int_number set to encoder number + pinMode(corresp[val],INPUT); // set interrupt pin as input + if (val == 0) {attachInterrupt(val, counter_0_change, RISING);counter_0=0;} //counter INT0 + else if (val == 1) {attachInterrupt(val, counter_1_change, RISING);counter_1=0;} //counter INT1 + else if (val == 2) {attachInterrupt(val, counter_2_change, RISING);counter_2=0;} //counter INT2 + else if (val == 3) {attachInterrupt(val, counter_3_change, RISING);counter_3=0;} //counter INT3 + else if (val == 4) {attachInterrupt(val, counter_4_change, RISING);counter_4=0;} //counter INT4 + else if (val == 5) {attachInterrupt(val, counter_5_change, RISING);counter_5=0;} //counter INT5 + } + /* ASKING POSITION OF A COUNTER */ + if (val==112) { //p = sending counting value + while (Serial.available()==0) {}; // Waiting char + val = Serial.read() ; //reading next value = counter number + if (val==0){ Serial.write((uint8_t*)&counter_0,4); }// asking counter 0 + else if (val==1){ Serial.write((uint8_t*)&counter_1,4); }// asking counter 1 + else if (val==2){ Serial.write((uint8_t*)&counter_2,4); }// asking counter 2 + else if (val==3){ Serial.write((uint8_t*)&counter_3,4); }// asking counter 3 + else if (val==4){ Serial.write((uint8_t*)&counter_4,4); }// asking counter 4 + else if (val==5){ Serial.write((uint8_t*)&counter_5,4); }// asking counter 5 + } + /* ASKING RELEASE OF AN INTERRUPT */ + if (val==114) { //r = release counter + while (Serial.available()==0) {}; // Waiting char + val = Serial.read(); //reading next value = counter number + detachInterrupt(val); // Detach interrupt on chanel A of counter num=val + if (val==0) { counter_0=0;} // Reset counter + else if (val==1) { counter_1=0;} // Reset counter + else if (val==2) { counter_2=0;} // Reset counter + else if (val==3) { counter_3=0;} // Reset counter + else if (val==4) { counter_4=0;} // Reset counter + else if (val==5) { counter_5=0;} // Reset counter + } + /* ASKING RESET VALUE OF AN COUNTER */ + if (val==122) { //z set to zero + while (Serial.available()==0) {}; // Waiting char + val = Serial.read(); //reading next value = counter number + if (val==0) { counter_0=0;} // Reset counter + else if (val==1) { counter_1=0;} // Reset counter + else if (val==2) { counter_2=0;} // Reset counter + else if (val==3) { counter_3=0;} // Reset counter + else if (val==4) { counter_4=0;} // Reset counter + else if (val==5) { counter_5=0;} // Reset counter + } + val=-1; + + } + + //case E -> Encoder + else if (val==69){ + /*Generic encoder functions */ + while (Serial.available()==0) {}; + val=Serial.read(); + /* ASKING ACTIVATION OF AN ENCODER */ + if (val==97) { //activation + while (Serial.available()==0) {}; // Waiting char + encoder_num=Serial.read(); // Read int_number (must be 0 or 1 on UNO / 1 to 5 on MEGA) : int_number set to encoer number + pinMode(corresp[encoder_num],INPUT); // set interrupt pin as input + while (Serial.available()==0) {}; // Waiting char + encoder_int2=Serial.read(); // Read int2 (must be a digital PIN with interrupt or not : depends on mode) + // no declaration for the moment : wait for encoder mode + while (Serial.available()==0) {}; // Waiting char + int mode = Serial.read()-48; // Read mode 1 ou 2 (1 counting only rising of chA, 2 counting rising and falling) + if (mode == 4) { // mode 4x : 2 cases : chA=pin2 / chB=pin3 or chA=pin3/chB=pin2 [Uno retriction] + pinMode(corresp[encoder_int2],INPUT); // set interrupt number as input + } else { + pinMode(encoder_int2,INPUT); // set pin as input + } + + if (encoder_num == 0) { //encoder INT0 + encoder_0_position=0; // Reset position + if (mode==4) { + encoder_0_int2=corresp[encoder_int2]; // Save pin of second interruption + attachInterrupt(encoder_num , encoder_change_m4_A0, CHANGE); // Attach interrupt on chanel A change + attachInterrupt(encoder_int2, encoder_change_m4_B0, CHANGE); // Attach interrupt on chanel B change + } else if (mode==2) { + encoder_0_int2=encoder_int2; + attachInterrupt(encoder_num, encoder_0_change_m2, CHANGE); // Attach interrupt on chanel A change + } else if (mode==1) { + encoder_0_int2=encoder_int2; + attachInterrupt(encoder_num, encoder_0_change_m1, RISING); // Attach interrupt on chanel A rising + } + } else if (encoder_num == 1) { //encoder INT1 + encoder_1_position=0; // Reset position + if (mode==4) { + encoder_1_int2=corresp[encoder_int2]; // Save pin of second interruption + attachInterrupt(encoder_num , encoder_change_m4_A1, CHANGE); // Attach interrupt on chanel A change + attachInterrupt(encoder_int2, encoder_change_m4_B1, CHANGE); // Attach interrupt on chanel B change + } else if (mode==2) { + encoder_1_int2=encoder_int2; + attachInterrupt(encoder_num, encoder_1_change_m2, CHANGE); // Attach interrupt on chanel A change + } else if (mode==1) { + encoder_1_int2=encoder_int2; + attachInterrupt(encoder_num, encoder_1_change_m1, RISING); // Attach interrupt on chanel A rising + } + } else if (encoder_num == 2) { //encoder INT2 + encoder_2_position=0; // Reset position + if (mode==4) { + encoder_2_int2=corresp[encoder_int2]; // Save pin of second interruption + attachInterrupt(encoder_num , encoder_change_m4_A2, CHANGE); // Attach interrupt on chanel A change + attachInterrupt(encoder_int2, encoder_change_m4_B2, CHANGE); // Attach interrupt on chanel B change + } else if (mode==2) { + encoder_2_int2=encoder_int2; + attachInterrupt(encoder_num, encoder_2_change_m2, CHANGE); // Attach interrupt on chanel A change + } else if (mode==1) { + encoder_2_int2=encoder_int2; + attachInterrupt(encoder_num, encoder_2_change_m1, RISING); // Attach interrupt on chanel A rising + } + } else if (encoder_num == 3) { //encoder INT3 + encoder_3_position=0; // Reset position + if (mode==4) { + encoder_3_int2=corresp[encoder_int2]; // Save pin of second interruption + attachInterrupt(encoder_num , encoder_change_m4_A3, CHANGE); // Attach interrupt on chanel A change + attachInterrupt(encoder_int2, encoder_change_m4_B3, CHANGE); // Attach interrupt on chanel B change + } else if (mode==2) { + encoder_3_int2=encoder_int2; + attachInterrupt(encoder_num, encoder_3_change_m2, CHANGE); // Attach interrupt on chanel A change + } else if (mode==1) { + encoder_3_int2=encoder_int2; + attachInterrupt(encoder_num, encoder_3_change_m1, RISING); // Attach interrupt on chanel A rising + } + } else if (encoder_num == 4) { //encoder INT4 + encoder_4_position=0; // Reset position + if (mode==4) { + encoder_4_int2=corresp[encoder_int2]; // Save pin of second interruption + attachInterrupt(encoder_num , encoder_change_m4_A4, CHANGE); // Attach interrupt on chanel A change + attachInterrupt(encoder_int2, encoder_change_m4_B4, CHANGE); // Attach interrupt on chanel B change + } else if (mode==2) { + encoder_4_int2=encoder_int2; + attachInterrupt(encoder_num, encoder_4_change_m2, CHANGE); // Attach interrupt on chanel A change + } else if (mode==1) { + encoder_4_int2=encoder_int2; + attachInterrupt(encoder_num, encoder_4_change_m1, RISING); // Attach interrupt on chanel A rising + } + } else if (encoder_num == 5) { //encoder INT5 + encoder_5_position=0; // Reset position + if (mode==4) { + encoder_5_int2=corresp[encoder_int2]; // Save pin of second interruption + attachInterrupt(encoder_num , encoder_change_m4_A5, CHANGE); // Attach interrupt on chanel A change + attachInterrupt(encoder_int2, encoder_change_m4_B5, CHANGE); // Attach interrupt on chanel B change + } else if (mode==2) { + encoder_5_int2=encoder_int2; + attachInterrupt(encoder_num, encoder_5_change_m2, CHANGE); // Attach interrupt on chanel A change + } else if (mode==1) { + encoder_5_int2=encoder_int2; + attachInterrupt(encoder_num, encoder_5_change_m1, RISING); // Attach interrupt on chanel A rising + } + } + } + /* ASKING POSITION OF AN ENCODER */ + if (val==112) { //p = sending encoder position + while (Serial.available()==0) {}; // Waiting char + val = Serial.read() ; //reading next value = encoder number + if (val==0){ Serial.write((uint8_t*)&encoder_0_position,4); }// asking encoder 0 position + else if (val==1){ Serial.write((uint8_t*)&encoder_1_position,4); }// asking encoder 1 position + else if (val==2){ Serial.write((uint8_t*)&encoder_2_position,4); }// asking encoder 2 position + else if (val==3){ Serial.write((uint8_t*)&encoder_3_position,4); }// asking encoder 3 position + else if (val==4){ Serial.write((uint8_t*)&encoder_4_position,4); }// asking encoder 4 position + else if (val==5){ Serial.write((uint8_t*)&encoder_5_position,4); }// asking encoder 5 position + } + /* ASKING RELEASE OF AN ENCODER */ + if (val==114) { //r = release encoder + while (Serial.available()==0) {}; // Waiting char + val = Serial.read(); //reading next value = encoder number + detachInterrupt(val); // Detach interrupt on chanel A of encoder num=val + if (val==0) { encoder_0_position=0;encoder_0_int2=-1;} // Reset position + else if (val==1) { encoder_1_position=0;encoder_1_int2=-1;} // Reset position + else if (val==2) { encoder_2_position=0;encoder_2_int2=-1;} // Reset position + else if (val==3) { encoder_3_position=0;encoder_3_int2=-1;} // Reset position + else if (val==4) { encoder_4_position=0;encoder_4_int2=-1;} // Reset position + else if (val==5) { encoder_5_position=0;encoder_5_int2=-1;} // Reset position + while (Serial.available()==0) {}; // Waiting char + val = Serial.read(); // reading next value = encoder number + detachInterrupt(val); // Detach interrupt on chanel B of encoder num=val (may be the same if mode=1 or 2) + } + /* ASKING RESET POSITION OF AN ENCODER */ + if (val==122) { // z = encoder position to zero + while (Serial.available()==0) {}; // Waiting char + val = Serial.read(); //reading next value = encoder number + if (val==0) { encoder_0_position=0;} // Reset position + else if (val==1) { encoder_1_position=0;} // Reset position + else if (val==2) { encoder_2_position=0;} // Reset position + else if (val==3) { encoder_3_position=0;} // Reset position + else if (val==4) { encoder_4_position=0;} // Reset position + else if (val==5) { encoder_5_position=0;} // Reset position + } + val=-1; + + } + + //case C -> DCmotor init + else if(val==67){ + while (Serial.available()==0) {}; + val = Serial.read(); + /* 2nd char = motor number */ + if (val>48 && val<53) { + dcm=val-48; + while (Serial.available()==0) {}; + val = Serial.read(); + /* the third received value indicates the pin1 number from ascii(2)=50 to ascii(e)=101 */ + if (val>49 && val<102) { + if (dcm==1) dcm1_pin1=val-48;/* calculate motor pin1 */ + if (dcm==2) dcm2_pin1=val-48;/* calculate motor pin1 */ + if (dcm==3) dcm3_pin1=val-48;/* calculate motor pin1 */ + if (dcm==4) dcm4_pin1=val-48;/* calculate motor pin1 */ + pinMode(val-48, OUTPUT); //set pin as output + analogWrite(val-48,0); /* DUTY CYCLE */ + while (Serial.available()==0) {}; + val = Serial.read(); + /* the fourth received value indicates the pin2 number from ascii(2)=50 to ascii(e)=101 */ + if (val>49 && val<102) { + if (dcm==1) dcm1_pin2=val-48;/* calculate motor pin2 */ + if (dcm==2) dcm2_pin2=val-48;/* calculate motor pin2 */ + if (dcm==3) dcm3_pin2=val-48;/* calculate motor pin2 */ + if (dcm==4) dcm4_pin2=val-48;/* calculate motor pin2 */ + pinMode(val-48, OUTPUT); //set pin as output + while (Serial.available()==0) {}; + val = Serial.read(); + /* the fifth received value indicates the pin2 number from ascii(2)=50 to ascii(e)=101 */ + if (val>47 && val<50) { + int mode = val-48; + if (dcm==1) dcm1_mode=mode;/* calculate motor mode */ + if (dcm==2) dcm2_mode=mode;/* calculate motor mode */ + if (dcm==3) dcm3_mode=mode;/* calculate motor mode */ + if (dcm==4) dcm4_mode=mode;/* calculate motor mode */ + //initialization of port + if(mode==0){//L293 + if (dcm==1) analogWrite(dcm1_pin2,0); /* DUTY CYCLE */ + if (dcm==2) analogWrite(dcm2_pin2,0); /* DUTY CYCLE */ + if (dcm==3) analogWrite(dcm3_pin2,0); /* DUTY CYCLE */ + if (dcm==4) analogWrite(dcm4_pin2,0); /* DUTY CYCLE */ + } else if (mode==1) {//L297 + if (dcm==1) digitalWrite(dcm1_pin2, LOW); /* DIRECTION */ + if (dcm==2) digitalWrite(dcm2_pin2, LOW); /* DIRECTION */ + if (dcm==3) digitalWrite(dcm3_pin2, LOW); /* DIRECTION */ + if (dcm==4) digitalWrite(dcm4_pin2, LOW); /* DIRECTION */ + } + Serial.print("OK"); // tell Scilab that motor s initialization finished + // Cette commande sert à rien dans la toolbox de base, + // sauf si on prévoit d'ajouter des actions à l'init des moteurs + // par exemple chercher la position d'origine ! + } + } + } + } + val=-1; + + } + + //case M -> DC motor + else if(val==77){ + while (Serial.available()==0) {}; + val = Serial.read(); + /* the second received value indicates the motor number + from abs('1')=49, motor1, to abs('4')=52, motor4 */ + if (val>48 && val<53) { + dcm=val-48; /* calculate motor number */ + while (Serial.available()==0) {}; // Waiting char + val = Serial.read(); + /* the third received value indicates the sens direction or release*/ + if (val==48 || val ==49){ + int direction=val-48; + while (Serial.available()==0) {}; // Waiting char + val = Serial.read(); //reading next value = 0..255 + if (dcm==1){ + if(dcm1_mode==0){//L293 + if(direction==1){ + analogWrite(dcm1_pin1,val); + analogWrite(dcm1_pin2,0); + } else { + analogWrite(dcm1_pin2,val); + analogWrite(dcm1_pin1,0); + } + } else {//L298 + if (direction==0) digitalWrite(dcm1_pin2,LOW); + if (direction==1) digitalWrite(dcm1_pin2,HIGH); + analogWrite(dcm1_pin1,val); + } + } + if (dcm==2){ + if(dcm2_mode==0){//L293 + if(direction==1){ + analogWrite(dcm2_pin1,val); + analogWrite(dcm2_pin2,0); + } else { + analogWrite(dcm2_pin2,val); + analogWrite(dcm2_pin1,0); + } + } else {//L298 + if (direction==0) digitalWrite(dcm2_pin2,LOW); + if (direction==1) digitalWrite(dcm2_pin2,HIGH); + analogWrite(dcm2_pin1,val); + } + } + if (dcm==3){ + if(dcm3_mode==0){//L293 + if(direction==1){ + analogWrite(dcm3_pin1,val); + analogWrite(dcm3_pin2,0); + } else { + analogWrite(dcm3_pin2,val); + analogWrite(dcm3_pin1,0); + } + } else {//L298 + if (direction==0) digitalWrite(dcm3_pin2,LOW); + if (direction==1) digitalWrite(dcm3_pin2,HIGH); + analogWrite(dcm3_pin1,val); + } + } + if (dcm==4){ + if(dcm4_mode==0){//L293 + if(direction==1){ + analogWrite(dcm4_pin1,val); + analogWrite(dcm4_pin2,0); + } else { + analogWrite(dcm4_pin2,val); + analogWrite(dcm4_pin1,0); + } + } else {//L298 + if (direction==0) digitalWrite(dcm4_pin2,LOW); + if (direction==1) digitalWrite(dcm4_pin2,HIGH); + analogWrite(dcm4_pin1,val); + } + } + } + if (val==114){//release motor + if(dcm==1) { + analogWrite(dcm1_pin1,0); + if(dcm1_mode==0) analogWrite(dcm1_pin2,0); + } + if(dcm==2) { + analogWrite(dcm2_pin1,0); + if(dcm2_mode==0) analogWrite(dcm2_pin2,0); + } + if(dcm==3) { + analogWrite(dcm3_pin1,0); + if(dcm3_mode==0) analogWrite(dcm3_pin2,0); + } + if(dcm==4) { + analogWrite(dcm4_pin1,0); + if(dcm4_mode==0) analogWrite(dcm4_pin2,0); + } + } + + } + val=-1; + + } + + + //case R -> Analog reference + if(val==82){ + while (Serial.available()==0) {}; + val = Serial.read(); + if (val==48) analogReference(DEFAULT); + if (val==49) analogReference(INTERNAL); + if (val==50) analogReference(EXTERNAL); + if (val==51) Serial.print("v3"); + val=-1; + } + +} /* end loop statement */ + + +/**************************************/ +// Generic interrupt encoder functions// +/**************************************/ +//Encoder on INT0 +void encoder_0_change_m1() { //encoder0 mode 1x + int chB=digitalRead(encoder_0_int2); + if (!chB) { encoder_0_position++;} + else { encoder_0_position--; } +} +void encoder_0_change_m2() { //encoder0 mode 2x + int chB=digitalRead(encoder_0_int2); + int chA=digitalRead(corresp[0]); + if ((chA & !chB)|(!chA & chB)) { encoder_0_position++; } + else { encoder_0_position--; } +} +void encoder_change_m4_A0(){//encoder0 mode 4x chA + int chA=digitalRead(corresp[0]); + int chB=digitalRead(encoder_0_int2); + if ((chA & !chB)|(!chA & chB)) { encoder_0_position++; } + else { encoder_0_position--; } +} +void encoder_change_m4_B0(){//encoder0 mode 4x chB + int chA=digitalRead(corresp[0]); + int chB=digitalRead(encoder_0_int2); + if ((!chA & !chB)|(chA & chB)) { encoder_0_position++; } + else { encoder_0_position--; } +} +//Encoder on INT1 +void encoder_1_change_m1() { //encoder1 mode 1x + int chB=digitalRead(encoder_1_int2); + if (!chB) { encoder_1_position++;} + else { encoder_1_position--; } +} +void encoder_1_change_m2() { //encoder1 mode 2x + int chB=digitalRead(encoder_1_int2); + int chA=digitalRead(corresp[1]); + if ((chA & !chB)|(!chA & chB)) { encoder_1_position++; } + else { encoder_1_position--; } +} +void encoder_change_m4_A1(){//encoder1 mode 4x chA + int chA=digitalRead(corresp[1]); + int chB=digitalRead(encoder_1_int2); + if ((chA & !chB)|(!chA & chB)) { encoder_1_position++; } + else { encoder_1_position--; } +} +void encoder_change_m4_B1(){//encoder1 mode 4x chB + int chA=digitalRead(corresp[1]); + int chB=digitalRead(encoder_1_int2); + if ((!chA & !chB)|(chA & chB)) { encoder_1_position++; } + else { encoder_1_position--; } +} +//Encoder on INT2 +void encoder_2_change_m1() { //encoder2 mode 1x + int chB=digitalRead(encoder_2_int2); + if (!chB) { encoder_2_position++;} + else { encoder_2_position--; } +} +void encoder_2_change_m2() { //encoder2 mode 2x + int chB=digitalRead(encoder_2_int2); + int chA=digitalRead(corresp[2]); + if ((chA & !chB)|(!chA & chB)) { encoder_2_position++; } + else { encoder_2_position--; } +} +void encoder_change_m4_A2(){//encoder2 mode 4x chA + int chA=digitalRead(corresp[2]); + int chB=digitalRead(encoder_2_int2); + if ((chA & !chB)|(!chA & chB)) { encoder_2_position++; } + else { encoder_2_position--; } +} +void encoder_change_m4_B2(){//encoder2 mode 4x chB + int chA=digitalRead(corresp[2]); + int chB=digitalRead(encoder_2_int2); + if ((!chA & !chB)|(chA & chB)) { encoder_2_position++; } + else { encoder_2_position--; } +} +//Encoder on INT3 +void encoder_3_change_m1() { //encoder3 mode 1x + int chB=digitalRead(encoder_3_int2); + if (!chB) { encoder_3_position++;} + else { encoder_3_position--; } +} +void encoder_3_change_m2() { //encoder3 mode 2x + int chB=digitalRead(encoder_3_int2); + int chA=digitalRead(corresp[3]); + if ((chA & !chB)|(!chA & chB)) { encoder_3_position++; } + else { encoder_3_position--; } +} +void encoder_change_m4_A3(){//encoder3 mode 4x chA + int chA=digitalRead(corresp[3]); + int chB=digitalRead(encoder_3_int2); + if ((chA & !chB)|(!chA & chB)) { encoder_3_position++; } + else { encoder_3_position--; } +} +void encoder_change_m4_B3(){//encoder3 mode 4x chB + int chA=digitalRead(corresp[3]); + int chB=digitalRead(encoder_3_int2); + if ((!chA & !chB)|(chA & chB)) { encoder_3_position++; } + else { encoder_3_position--; } +} +//Encoder on INT4 +void encoder_4_change_m1() { //encoder4 mode 1x + int chB=digitalRead(encoder_4_int2); + if (!chB) { encoder_4_position++;} + else { encoder_4_position--; } +} +void encoder_4_change_m2() { //encoder4 mode 2x + int chB=digitalRead(encoder_4_int2); + int chA=digitalRead(corresp[4]); + if ((chA & !chB)|(!chA & chB)) { encoder_4_position++; } + else { encoder_4_position--; } +} +void encoder_change_m4_A4(){//encoder4 mode 4x chA + int chA=digitalRead(corresp[4]); + int chB=digitalRead(encoder_4_int2); + if ((chA & !chB)|(!chA & chB)) { encoder_4_position++; } + else { encoder_4_position--; } +} +void encoder_change_m4_B4(){//encoder4 mode 4x chB + int chA=digitalRead(corresp[4]); + int chB=digitalRead(encoder_4_int2); + if ((!chA & !chB)|(chA & chB)) { encoder_4_position++; } + else { encoder_4_position--; } +} +//Encoder on INT5 +void encoder_5_change_m1() { //encoder5 mode 1x + int chB=digitalRead(encoder_5_int2); + if (!chB) { encoder_5_position++;} + else { encoder_5_position--; } +} +void encoder_5_change_m2() { //encoder5 mode 2x + int chB=digitalRead(encoder_5_int2); + int chA=digitalRead(corresp[5]); + if ((chA & !chB)|(!chA & chB)) { encoder_5_position++; } + else { encoder_5_position--; } +} +void encoder_change_m4_A5(){//encoder5 mode 4x chA + int chA=digitalRead(corresp[5]); + int chB=digitalRead(encoder_5_int2); + if ((chA & !chB)|(!chA & chB)) { encoder_5_position++; } + else { encoder_5_position--; } +} +void encoder_change_m4_B5(){//encoder5 mode 4x chB + int chA=digitalRead(corresp[5]); + int chB=digitalRead(encoder_5_int2); + if ((!chA & !chB)|(chA & chB)) { encoder_5_position++; } + else { encoder_5_position--; } +} + +/**************************************/ +// Generic interrupt counter functions// +/**************************************/ +//Counter on INT0 +void counter_0_change() { //counter 0 + counter_0++; +} +//Counter on INT1 +void counter_1_change() { //counter 1 + counter_1++; +} +//Counter on INT2 +void counter_2_change() { //counter 2 + counter_2++; +} +//Counter on INT3 +void counter_3_change() { //counter 3 + counter_3++; +} +//Counter on INT4 +void counter_4_change() { //counter 4 + counter_4++; +} +//Counter on INT5 +void counter_5_change() { //counter 5 + counter_5++; +} + + |