Как кодировать EEPROM с помощью потенциометра в Arduino

У меня есть код, который я получил с сайта. Я пытался добавить 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
}

}

-1

Решение

Код, который вы опубликовали, никогда не будет пытаться прочитать данные из EEPROM из-за следующей проблемы:

Когда ваш микроконтроллер запущен, переменная mode установлен на 1. Если вы внимательно посмотрите на loop Функция вы можете увидеть, что ваш код будет вводить case 1 по крайней мере, один раз, когда он в основном записывает данные в EEPROM и — что более важно — установит addr до значения, отличного от 0, из-за addr++ инструкции (если вы не запустите код так долго, что вы столкнетесь с целочисленным переполнением).

Единственное место, где вы пытаетесь читать из EEPROM, находится в Play функция. Из-за if (addr == 0) условие в этой функции вы никогда не будете выполнять EEPROM.read инструкции как addr не будет 0, как объяснено выше.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector