Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 4D robotarm
- // v 0.9 Nano Bluetooth
- // Need application!
- #include <EEPROM.h>
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- #include <Servo.h>
- Servo servo1; // create servo object to control a servo
- Servo servo2;
- Servo servo3;
- Servo servo4;
- LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
- uint8_t sbc=0, motor; // sbc - serial buffer counter
- uint8_t sbuffer[100]; // serial buffer
- int lepes=10;
- long counter=0, count1=2000;
- uint8_t M1dest=90, M2dest=90, M3dest=90, M4dest=90; // destination position
- uint8_t M1pos=90, M2pos=90, M3pos=90, M4pos=90; // actual pos
- uint8_t value, stepcounter=0, stepcounter1=0;
- bool RUN=false; // RUN status
- uint8_t steps[5][100] = {};
- uint8_t servoMM[5][2]={};
- void setup() {
- pinMode(A1,INPUT_PULLUP);
- Serial.begin(9600);
- servo1.attach(6);
- servo2.attach(11);
- servo3.attach(10);
- servo4.attach(9);
- lcd.begin(16,2); // lcd init
- lcd.clear();
- lcd.print("Start ...");
- servoMM[1][0]=EEPROM.read(1); // servo1 min
- servoMM[1][1]=EEPROM.read(2); // servo1 max
- servoMM[2][0]=EEPROM.read(3);
- servoMM[2][1]=EEPROM.read(4);
- servoMM[3][0]=EEPROM.read(5);
- servoMM[3][1]=EEPROM.read(6);
- servoMM[4][0]=EEPROM.read(7);
- servoMM[4][1]=EEPROM.read(8);
- if (digitalRead(A1)==LOW) {
- lcd.setCursor(0,0);
- lcd.print("Setting ");
- minMaxSet();
- }
- }
- void loop() {
- byte dataInb;
- if (Serial.available() > 0) {
- dataInb = Serial.read(); // Read the data as byte
- sbuffer[sbc++]=dataInb;
- if (dataInb==120) { // 120 - x, the end marker
- if (sbc==2) { // If serial data counter 2, check the first char. The second char is end marker
- if (sbuffer[0]==65) { // A - slow
- count1=8000;
- counter=0;
- lcd.setCursor(0,0);
- lcd.print("SLOW ");
- }
- if (sbuffer[0]==66) { // B - normal
- count1=2000;
- counter=0;
- lcd.setCursor(0,0);
- lcd.print("NORMAL ");
- }
- if (sbuffer[0]==67) { // C - fast
- count1=1;
- counter=0;
- lcd.setCursor(0,0);
- lcd.print("FAST ");
- }
- if (sbuffer[0]==83) { // S - Save
- lcd.clear();
- lcd.print(M1dest);
- lcd.print(" ");
- lcd.print(M2dest);
- lcd.print(" ");
- lcd.print(M3dest);
- lcd.print(" ");
- lcd.print(M4dest);
- lcd.setCursor(0,1);
- lcd.print(stepcounter);
- steps[1][stepcounter] = M1dest;
- steps[2][stepcounter] = M2dest;
- steps[3][stepcounter] = M3dest;
- steps[4][stepcounter] = M4dest;
- stepcounter++;
- if (stepcounter>=100) stepcounter=99;
- lcd.setCursor(0,0);
- lcd.print("SAVE: ");
- lcd.setCursor(0,7);
- lcd.print(stepcounter);
- lcd.print(" ");
- }
- if (sbuffer[0]==76) { // L - Run
- if (stepcounter1>=stepcounter) stepcounter1=0; // Ha végig ment a program, akkor a lépésszámláló nullázódik
- if (stepcounter>0) RUN=true; // Van-e valamilyen érték a lépéstárolóban
- lcd.setCursor(0,0);
- lcd.print("RUN ");
- }
- if (sbuffer[0]==75) { // K - Pause
- RUN=false;
- lcd.setCursor(0,0);
- lcd.print("PAUSE ");
- }
- if (sbuffer[0]==82) { // R - Reset
- RUN=false;
- stepcounter=0;
- stepcounter1=0;
- M1dest=M1pos;
- M2dest=M2pos;
- M3dest=M3pos;
- M4dest=M4pos;
- lcd.setCursor(0,0);
- lcd.print("RESET ");
- }
- }
- if (sbuffer[0]==77 and RUN==false) { // M - motor, csak akkor vesz figyelembe új értéket, ha áll
- motor=sbuffer[1]-48; // Selected motor number. second char the position value
- valuecalc();
- lcd.setCursor(0,0);
- lcd.print("Motor: ");
- lcd.setCursor(0,7);
- lcd.print(motor);
- lcd.print(" ");
- }
- sbc=0;
- }
- }
- counter++;
- if (counter>=count1) {
- counter=0;
- if (M1dest>M1pos) {
- M1pos++;
- servo1.write(M1pos);
- }
- if (M1dest<M1pos) {
- M1pos--;
- servo1.write(M1pos);
- }
- if (M2dest>M2pos) {
- M2pos++;
- servo2.write(M2pos);
- }
- if (M2dest<M2pos) {
- M2pos--;
- servo2.write(M2pos);
- }
- if (M3dest>M3pos) {
- M3pos++;
- servo3.write(M3pos);
- }
- if (M3dest<M3pos) {
- M3pos--;
- servo3.write(M3pos);
- }
- if (M4dest>M4pos) {
- M4pos++;
- servo4.write(M4pos);
- }
- if (M4dest<M4pos) {
- M4pos--;
- servo4.write(M4pos);
- }
- if (M1dest==M1pos and M2dest==M2pos and M3dest==M3pos and M4dest==M4pos and RUN==true) { // Ha mind a 4 motor a pozícióján van
- if (stepcounter1<stepcounter) { // Ha a futás közbeni lépés számláló kissebb, mint a lépés tároló, akkor a következő lépésre lép
- M1dest = steps[1][stepcounter1];
- M2dest = steps[2][stepcounter1];
- M3dest = steps[3][stepcounter1];
- M4dest = steps[4][stepcounter1];
- lcd.clear();
- lcd.print(M1dest);
- lcd.print(" ");
- lcd.print(M2dest);
- lcd.print(" ");
- lcd.print(M3dest);
- lcd.print(" ");
- lcd.print(M4dest);
- lcd.setCursor(0,1);
- lcd.print(stepcounter1);
- delay(1000);
- stepcounter1++; // Futás közbeni lépésszámláló növelése
- }
- else { // A futás közbeni lépés számláló nagyobb, mint a lépés tároló, nincs több lépés, futás vége
- RUN=false;
- }
- }
- }
- //delay(10);
- }
- void valuecalc() {
- uint8_t sz=0,i ;
- for ( i=1;i<=10;i++) { // Serial buffer check
- if (sbuffer[i]==120 or sbuffer[i]==46) { // If x or ., end the checking
- sz=i-1; // Serial buffel -1, chunk the end marker
- break;
- }
- }
- //for (i=2;i<=sz;i++) {
- //}
- if (sz==2) { // If the serial buffer size 3 char (exp. M18 - M - motor, 1 - motor number, 8 - position value), then the data size only 1 char
- value=sbuffer[2]-48;
- }
- if (sz==3) { // If the serial buffer size 4 char (exp. M247 - M - motor, 2 - motor number, 47 - position value), then the data size 2 char
- value=(sbuffer[2]-48)*10;
- value=value+sbuffer[3]-48;
- }
- if (sz==4) { // If the serial buffer size 5 char (exp. M4152 - M - motor, 4 - motor number, 152 - position value), then the data size 3 char
- value=(sbuffer[2]-48)*100;
- value=value+(sbuffer[3]-48)*10;
- value=value+sbuffer[4]-48;
- }
- if (motor==1) {
- M1dest=map(value,0,180,servoMM[1][0],servoMM[1][1]);
- }
- if (motor==2) {
- M2dest=map(value,0,180,servoMM[2][0],servoMM[2][1]);
- }
- if (motor==3) {
- M3dest=map(value,0,180,servoMM[3][0],servoMM[3][1]);
- }
- if (motor==4) {
- M4dest=map(value,0,180,servoMM[4][0],servoMM[4][1]);
- }
- }
- void minMaxSet () {
- while (digitalRead(A1)==LOW);
- lcd.setCursor(0,0);
- lcd.print("Servo1 min:");
- while (digitalRead(A1)==HIGH) {
- value=map(analogRead(A0),0,1024,0,180);
- servo1.write(value);
- lcd.setCursor(12,0);
- lcd.print(value);
- lcd.print(" ");
- }
- while (digitalRead(A1)==LOW);
- servoMM[1][0]=value;
- EEPROM.write(1,value); // servo1 min
- lcd.setCursor(0,0);
- lcd.print("Servo1 max:");
- while (digitalRead(A1)==HIGH) {
- value=map(analogRead(A0),0,1024,0,180);
- servo1.write(value);
- lcd.setCursor(12,0);
- lcd.print(value);
- lcd.print(" ");
- }
- while (digitalRead(A1)==LOW);
- servoMM[1][1]=value;
- EEPROM.write(2,value); // servo1 max
- lcd.setCursor(0,0);
- lcd.print("Servo1 test: ");
- while (digitalRead(A1)==HIGH) {
- value=map(analogRead(A0),0,1024,servoMM[1][0],servoMM[1][1]);
- servo1.write(value);
- lcd.setCursor(13,0);
- lcd.print(value);
- lcd.print(" ");
- lcd.setCursor(0,1);
- lcd.print(servoMM[1][0]);
- lcd.print(" ");
- lcd.print(servoMM[1][1]);
- lcd.print(" ");
- }
- while (digitalRead(A1)==LOW);
- lcd.clear();
- lcd.print("Servo2 min:");
- // SERVO2
- while (digitalRead(A1)==HIGH) {
- value=map(analogRead(A0),0,1024,0,180);
- servo2.write(value);
- lcd.setCursor(12,0);
- lcd.print(value);
- lcd.print(" ");
- }
- while (digitalRead(A1)==LOW);
- servoMM[2][0]=value;
- EEPROM.write(3,value); // servo1 min
- lcd.setCursor(0,0);
- lcd.print("Servo2 max:");
- while (digitalRead(A1)==HIGH) {
- value=map(analogRead(A0),0,1024,0,180);
- servo2.write(value);
- lcd.setCursor(12,0);
- lcd.print(value);
- lcd.print(" ");
- }
- while (digitalRead(A1)==LOW);
- servoMM[2][1]=value;
- EEPROM.write(4,value); // servo1 max
- lcd.setCursor(0,0);
- lcd.print("Servo2 test: ");
- while (digitalRead(A1)==HIGH) {
- value=map(analogRead(A0),0,1024,servoMM[2][0],servoMM[2][1]);
- servo2.write(value);
- lcd.setCursor(13,0);
- lcd.print(value);
- lcd.print(" ");
- lcd.setCursor(0,1);
- lcd.print(servoMM[2][0]);
- lcd.print(" ");
- lcd.print(servoMM[2][1]);
- lcd.print(" ");
- }
- while (digitalRead(A1)==LOW);
- lcd.clear();
- lcd.print("Servo3 min:");
- // SERVO3
- while (digitalRead(A1)==HIGH) {
- value=map(analogRead(A0),0,1024,0,180);
- servo3.write(value);
- lcd.setCursor(12,0);
- lcd.print(value);
- lcd.print(" ");
- }
- while (digitalRead(A1)==LOW);
- servoMM[3][0]=value;
- EEPROM.write(5,value); // servo1 min
- lcd.setCursor(0,0);
- lcd.print("Servo3 max:");
- while (digitalRead(A1)==HIGH) {
- value=map(analogRead(A0),0,1024,0,180);
- servo3.write(value);
- lcd.setCursor(12,0);
- lcd.print(value);
- lcd.print(" ");
- }
- while (digitalRead(A1)==LOW);
- servoMM[3][1]=value;
- EEPROM.write(6,value); // servo1 max
- lcd.setCursor(0,0);
- lcd.print("Servo3 test: ");
- while (digitalRead(A1)==HIGH) {
- value=map(analogRead(A0),0,1024,servoMM[3][0],servoMM[3][1]);
- servo3.write(value);
- lcd.setCursor(13,0);
- lcd.print(value);
- lcd.print(" ");
- lcd.setCursor(0,1);
- lcd.print(servoMM[3][0]);
- lcd.print(" ");
- lcd.print(servoMM[3][1]);
- lcd.print(" ");
- }
- while (digitalRead(A1)==LOW);
- lcd.clear();
- lcd.print("Servo4 min:");
- // SERVO4
- while (digitalRead(A1)==HIGH) {
- value=map(analogRead(A0),0,1024,0,180);
- servo4.write(value);
- lcd.setCursor(12,0);
- lcd.print(value);
- lcd.print(" ");
- }
- while (digitalRead(A1)==LOW);
- servoMM[4][0]=value;
- EEPROM.write(7,value); // servo1 min
- lcd.setCursor(0,0);
- lcd.print("Servo4 max:");
- while (digitalRead(A1)==HIGH) {
- value=map(analogRead(A0),0,1024,0,180);
- servo4.write(value);
- lcd.setCursor(12,0);
- lcd.print(value);
- lcd.print(" ");
- }
- while (digitalRead(A1)==LOW);
- servoMM[4][1]=value;
- EEPROM.write(8,value); // servo1 max
- lcd.setCursor(0,0);
- lcd.print("Servo4 test: ");
- while (digitalRead(A1)==HIGH) {
- value=map(analogRead(A0),0,1024,servoMM[4][0],servoMM[4][1]);
- servo4.write(value);
- lcd.setCursor(13,0);
- lcd.print(value);
- lcd.print(" ");
- lcd.setCursor(0,1);
- lcd.print(servoMM[4][0]);
- lcd.print(" ");
- lcd.print(servoMM[4][1]);
- lcd.print(" ");
- }
- while (digitalRead(A1)==LOW);
- lcd.setCursor(0,0);
- lcd.print("Setting OK.");
- delay(500);
- }
- //END
Add Comment
Please, Sign In to add comment