设置引脚模式时,Wemos D1复位

时间:2017-07-14 13:43:22

标签: arduino esp8266 arduino-esp8266

我正在建造一辆由Wemos D1板遥控的小型车,以便设置WiFi连接和我正在运行此脚本的控制逻辑:

#include <ESP8266WiFi.h>

const char* pass = "**********";
const char* ssid = "**********";

IPAddress ip(192,168,1,91);
IPAddress gat(192,168,1,1);
IPAddress dns(192,168,1,1);
IPAddress sub(255,255,255,0);

WiFiServer s(2000);

int inA1 = 1;
int inA2 = 2;
int enA = 3;
int inB1 = 4;
int inB2 = 5;
int enB = 6;
int trigger = 7;
int echo = 8;
double vSuono = 343; //Unità di misura: m/s
int speed = 255;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  WiFi.config(ip,gat,sub,dns);
  WiFi.begin(ssid,pass);
  delay(500);

  while(WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.println(".");
  }

  Serial.println("Connected!");
  delay(30);

  s.begin();
  Serial.println("Server running!");
  delay(30);

  //Here starts the problems
  pinMode(inA1,OUTPUT);
  pinMode(inA2,OUTPUT);
  pinMode(enA,OUTPUT);
  pinMode(inB1,OUTPUT);
  pinMode(inB2,OUTPUT);
  pinMode(enB,OUTPUT);
  pinMode(trigger,OUTPUT);
  pinMode(echo,INPUT);
  delay(500);
}

void loop() {
  // put your main code here, to run repeatedly:
  WiFiClient c = s.available();
  delay(30);
  if(c){
    Serial.println("New client connected!");
    delay(3);
    while(c.connected()){
      if(c.available()){
        String command = c.readStringUntil('\n');

        if(command == "forward"){
          Serial.println("forward");
          forward(speed);
        }else if(command == "right"){
          Serial.println("right");
          right(speed);
        }else if(command == "left"){
          Serial.println("left");
          left(speed);
        }else{
          Serial.println("back");
          back(speed);
        }
      }
      delay(30);
    }
    c.stop();
  }
}

void forward(int velocita){
  digitalWrite(inA1,HIGH);
  digitalWrite(inA2,LOW);
  digitalWrite(inB1,HIGH);
  digitalWrite(inB2,LOW);
  analogWrite(enA,velocita);
  analogWrite(enB,velocita);
}

void left(int velocita){
  digitalWrite(inA1,HIGH);
  digitalWrite(inA2,LOW);
  digitalWrite(inB1,LOW);
  digitalWrite(inB2,HIGH);
  analogWrite(enA,velocita);
  analogWrite(enB,velocita);
}

void right(int velocita){
  digitalWrite(inA1,LOW);
  digitalWrite(inA2,HIGH);
  digitalWrite(inB1,HIGH);
  digitalWrite(inB2,LOW);
  analogWrite(enA,velocita);
  analogWrite(enB,velocita);
}

void back(int velocita){
  digitalWrite(inA1,LOW);
  digitalWrite(inA2,HIGH);
  digitalWrite(inB1,LOW);
  digitalWrite(inB2,HIGH);
  analogWrite(enA,velocita);
  analogWrite(enB,velocita);
}

void stop(){
  digitalWrite(inA1,LOW);
  digitalWrite(inA2,LOW);
  digitalWrite(inB1,LOW);
  digitalWrite(inB2,LOW);
}

问题是当电路板在setup()块中执行pinMode功能时,电路板会停止执行,崩溃并重新启动,而我无法ping电路板。 如果我通过pinMode调用注释setup()块的所有部分,程序开始工作,但显然我不能使用引脚。 在出现电路板崩溃的串行监视器上显示以下消息:

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

wdt reset
load 0x4010f000, len 1384, room 16 
tail 8
chksum 0x2d
csum 0x2d
v09f0c112
~ld

可能是什么问题?

2 个答案:

答案 0 :(得分:1)

我不知道引脚映射,但你应该坚持名为D1,D2 ... D8的GPIO引脚。你已经将它们命名为1,2 ... 8,它们是不同的引脚。您可能使用了其他东西使用的引脚(如串行或重置)。

int inA1 = D1;
int inA2 = D2;
int enA = D3;
int inB1 = D4;
int inB2 = D5;
int enB = D6;
int trigger = D7;
int echo = D8;

答案 1 :(得分:0)

在尝试将pinMode与digitalWrite()函数一起使用时,我遇到了相同的wdt重置错误。 我通过弄清楚Wemos Pin映射是如何工作的来解决的。 实际上,您需要以“ Dx”表示法引用该引脚。 例如  rsync -P -rsh remoteuser@remotehost:/remote/path /local/path

digitalWrite(D15,LOW);

此外,请确保在工具>板上选择“ Wemos D1 R1”,以便Dx常数匹配  标签。

在Arduino FOrum上查看对话,以了解有关wemos引脚映射的更多信息: https://forum.arduino.cc/index.php?topic=545113.0