У меня есть код, который я получил с сайта. Я пытался добавить EEPROM в этот код, но я не могу сделать это правильно. Я попытался добавить EEPROM.write и EEPROm.read Я также добавил еще один сервопривод
Может ли кто-нибудь помочь мне с этим, Добавление EEPROM в коде? Заранее спасибо 🙂
Вот код (простая роботизированная рука с функцией воспроизведения и записи):
#include <Servo.h>
#include <EEPROM.h>
const int PinButton1 = 2; // pin 2
const int PinButton2 = 3; // pin 3
int mode = 1; // case 1 program robot arm. case 2 replay positions
int bounce = 0;
volatile int buttonPress = 0;
unsigned long lastButtonPressTime = 0;
volatile unsigned long bounceTime = 0;
Servo Arm0Servo; //servo objects
Servo Arm1Servo; // Ihave renumbered servos 26 1 2017
Servo Arm2Servo;
Servo Arm3Servo;
Servo Arm4Servo;
int pos1,pos2,pos3,pos4,pos0;
int PosArm[5] ; // array
int ArmPos[100][5]; // array to hold arm positions up to 100
int PosCount = 0; // to count number of positions increased when button pressed
int PosCountMax = 0; // number of positions recorded when double button push initiates replay mode
int PosReached = 0; // used to check that arm has moved from one recorded position to next position
int addr = 0;
boolean recorded = false;
void setup() {
for(int i = 0; i <100 ; i++ ){
for(int p = 0; p <5 ; p++ ){
ArmPos[i][p] = -1;
}
}
pinMode(PinButton1 , OUTPUT);
digitalWrite(PinButton1 ,LOW);
pinMode(PinButton2, INPUT_PULLUP);
// I have made a small change here due to problem using some Arduinos
//attachInterrupt( digitalPinToInterrupt(PinButton2),ButtonPress , LOW );
// digitalPinToInterrupt(PinButton2) may not be defined!
attachInterrupt( 1,ButtonPress , LOW ); // interupt to capture button presses
// attach servos to relervent pins on arduino nano
Arm0Servo.attach(12); // grip 90 to 180 open limits of servo movement
Arm1Servo.attach(11); // elbow to 130 up
Arm2Servo.attach(10); // shoulder 10 to 50 down
Arm3Servo.attach(9); // turn 0 to 180 right
Arm4Servo.attach(8); // turn 0 to 180 right
}
void loop() {
switch(mode){
case 1 : // program robot arm. 1 press to remember position. 2 presses to progress next case 2 replay mode
// analogRead(pin) that reads poteniometers on training arm
PosArm[0] = map(analogRead(0),480,1024,180,10); // map (480,1024 value from potentiometer to 180,90 value sent to servo)
EEPROM.write(addr, PosArm[0]);
addr++;
PosArm[1] = map(analogRead(1),480,1024,180,10);
EEPROM.write(addr, PosArm[1]);
addr++;
PosArm[2] = map(analogRead(2),480,1024,180,10);
EEPROM.write(addr, PosArm[2]);
addr++;
PosArm[3] = map(analogRead(3),480,1024,180,10);
EEPROM.write(addr, PosArm[3]);
addr++;
PosArm[4] = map(analogRead(4),480,1024,180,10);
EEPROM.write(addr, PosArm[4]);
addr++;
MoveArm(); // call method
if(buttonPress == 1){ // flag set by interupt when button is pressed
buttonPress = 0; // reset flag
if( millis() > (lastButtonPressTime + 1000)){ // only one button press in one secound
// record position of arm PosArm to array[100][] of armpositions
ArmPos[PosCount][0] = PosArm[0];
ArmPos[PosCount][1] = PosArm[1];
ArmPos[PosCount][2] = PosArm[2];
ArmPos[PosCount][3] = PosArm[3];
ArmPos[PosCount][4] = PosArm[4];if (addr == 512) {
EEPROM.write(addr, 255);
break;
}
if( PosCount < 100) { // stop recording if over 100 positions recorded (memory limitations)
PosCount++;
}
}else{ // more than one button press
mode = 2; // go to next phase
PosCountMax = PosCount; // set number of arm positions recorded
PosCount = 0; // reset count ready to read arm position array from begining
}
lastButtonPressTime = millis();
}
break;
case 2 : // read arm position array
PosReached = 0;
for(int i = 0; i <5 ; i++ ){ //adjust servo positions
// we move the servos in small steps and the delay(20) makes arm motion smooth and slow
if( PosArm[i] > ArmPos[PosCount][i]) PosArm[i] = PosArm[i] - 1; // if actual position is greater than requird position reduce position by 1
if( PosArm[i] < ArmPos[PosCount][i]) PosArm[i] = PosArm[i] + 1; // if actual position is less than required position value increase position valuue by 1
if( PosArm[i] == ArmPos[PosCount][i]) PosReached++; // check if servo has reached required position/angle
}
if(PosReached == 5) PosCount++; // if all 4 servos have reached position then increase array index (PosCount)to next position in array
if(PosCount == PosCountMax) PosCount = 0; // if end of array reached reset index to 0 and repeat.
Play(); // physically move arm to updated position, this is broken into small steps
delay(5); // pause between moves so over all motion is slowed down
break;
default :
break;
}
}
void MoveArm() { // write arm position data to servos
for (int i = 0 ; i < 5 ; i++) {
if (PosArm[i] < 5) PosArm[i] = 5; // limit servo movement to prevent hitting end stops
if (PosArm[i] > 175) PosArm[i] = 175; // servo.write limited 5 - 175
}
Arm0Servo.write(PosArm[0]);
Arm1Servo.write(PosArm[1]);
Arm2Servo.write(PosArm[2]);
Arm3Servo.write(PosArm[3]);
Arm4Servo.write(PosArm[4]);
Play();
delay(5);
}
void Play() { // write arm position data to servos
for (int i = 0 ; i < 5 ; i++) {
if (PosArm[i] < 5) PosArm[i] = 5; // limit servo movement to prevent hitting end stops
if (PosArm[i] > 175) PosArm[i] = 175; // servo.write limited 5 - 175
}
if (addr == 0) {
PosArm[0] = EEPROM.read(addr);
pos0 = EEPROM.read(addr+5);
addr++;
PosArm[1] = EEPROM.read(addr);
pos1 = EEPROM.read(addr+5);
addr++;
PosArm[2] = EEPROM.read(addr);
pos2 = EEPROM.read(addr+5);
addr++;
PosArm[3] = EEPROM.read(addr);
pos3 = EEPROM.read(addr+5);
addr++;
PosArm[4] = EEPROM.read(addr);
pos4 = EEPROM.read(addr+5);
addr++;
}
}
void ButtonPress(){ // interupt to capture button press
if(micros() > (bounceTime + 3000)){ // debounce timer
bounceTime = micros(); // ingnore interupts due to button bounce
buttonPress = 1; // flag for button pressed
}
}
Код, который вы опубликовали, никогда не будет пытаться прочитать данные из EEPROM из-за следующей проблемы:
Когда ваш микроконтроллер запущен, переменная mode
установлен на 1. Если вы внимательно посмотрите на loop
Функция вы можете увидеть, что ваш код будет вводить case 1
по крайней мере, один раз, когда он в основном записывает данные в EEPROM и — что более важно — установит addr
до значения, отличного от 0, из-за addr++
инструкции (если вы не запустите код так долго, что вы столкнетесь с целочисленным переполнением).
Единственное место, где вы пытаетесь читать из EEPROM, находится в Play
функция. Из-за if (addr == 0)
условие в этой функции вы никогда не будете выполнять EEPROM.read
инструкции как addr
не будет 0, как объяснено выше.
Других решений пока нет …