Почему ESP8266 сбрасывается в режиме загрузки по причине 2: (3,6) - Серводвигатель не вращается? - PullRequest
0 голосов
/ 17 апреля 2020

Я написал этот код, чтобы вращать сервопривод в выбранный промежуток времени, выбранный потенциометром, но сервопривод не вращается. Также разница во времени остается всегда нулевой, даже при изменении значения потенциометра.

#include <ESP8266WiFi.h>
    #include <Ticker.h>
    #include <Servo.h>

    Servo servo;
    Ticker blinker;
    #define redLedPin 2 //D4
    #define blueLedPin 16 //D0
    #define whiteLedPin 5//D1

    int potPin = A0;
    int potVal;
    int mapPotVal;
    int count = 0;
    int count1 = 0;
    int fPrevTime;
    int fFinTime;
    int rPrevTime;
    int rFinTime;
    int fDiff;
    int rDiff;
    int test = 0;
    int redLedState;
    int blueLedState;
    int whiteLedState;

    void ICACHE_RAM_ATTR onTimerISR(){
        timer1_write(1000);//10us
      count1++;

    }
    void changeOfState(){
      count++;
      potVal = analogRead(potPin);
      mapPotVal = map(potVal,0,1023,0,10); 
      if(mapPotVal <=2 && test == 0){
        fPrevTime = count;
        test = 1;
      }
      if(mapPotVal >= 8 && test == 1){
        fFinTime = count;
        test = 0;
      }
      if(mapPotVal <=2 && test == 1){
        rFinTime = count;
        test = 0;
      }
      if(mapPotVal >= 8 && test == 0){
        rPrevTime = count;
        test = 1;
      }

      if(fFinTime -fPrevTime >0){
      fDiff = fFinTime -fPrevTime;
      }
      else {
        fDiff = fPrevTime - fFinTime;
      }
      if(rFinTime -rPrevTime >0){
      rDiff = rFinTime -rPrevTime;
      }
      else {
        rDiff = rPrevTime - rFinTime;
      }

      }

    void setup(){
      //initialize ticker every 1 s
      timer1_attachInterrupt(onTimerISR);
      timer1_enable(TIM_DIV16, TIM_EDGE,TIM_SINGLE);
      timer1_write(1000);
      Serial.begin(115200);
      servo.attach(4); //D2
      servo.write(0);
      delay(100);

      pinMode(redLedPin,OUTPUT);
      pinMode(blueLedPin,OUTPUT);
      pinMode(whiteLedPin,OUTPUT);

      pinMode(potPin,INPUT);

      blinker.attach_ms(1,changeOfState);
    }


    void loop() {
      Serial.print("count  = ");
      Serial.println(count);
      Serial.print("\ncount1 = ");
      Serial.println(count1);
      Serial.print("fDiff = ");
      Serial.println(fDiff);
      Serial.print("\nrDiff = ");
      Serial.println(rDiff);
      Serial.print("Pot Map Val = ");
      Serial.println(mapPotVal);
      digitalWrite(redLedPin,HIGH);

      for (int i =0;i=90;i++){
        servo.write(i);
      }
      delay(fDiff);
      digitalWrite(redLedPin,LOW);
      for (int i =90;i=0;i--){
        servo.write(i);
      }
      delay(2*fDiff);
    }

Вывод, показывающий это

ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1392, room 16 
tail 0
chksum 0xd0
csum 0xd0
v3d128e5c
~ld
count  = 0

count1 = 0
fDiff = 0

rDiff = 0
Pot Map Val = 0

1 Ответ

0 голосов
/ 17 апреля 2020

Полагаю, это так:
Устройства на GPIO 0, 2 или 15?
Они управляют режимом загрузки ESP, и если какое-либо устройство, которое вы подключили, поднимает неправильный вывод на высокий или низкий уровень, оно изменит режим загрузки с обычного на другое. => сбросить по причине 2 режима загрузки: (3,6)
И при перепрошивке обязательно выбрать erease all fla sh.

...