Wemos D1在设置引脚模式时重置

3

我正在制作一辆小车,由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通板子。 如果我注释掉setup()块中所有pinMode调用的部分,程序开始工作,但显然我无法使用引脚。 在板子崩溃时,在串行监视器上出现如下信息:
 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个回答

2

我不知道引脚映射的具体情况,但你应该使用命名为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;

谢谢,它有效了。我在Arduino Uno克隆版上实现了控制逻辑,当我将引脚命名为1、2、3...时,脚本可以正常工作,但在Wemos D1上却不行。不过,我也会在Arduino Uno版本上更改引脚名称。非常感谢。 - SimCor
在Arduino Uno上更改引脚名称是行不通的。这些名称仅适用于Wemos D1。当您在下拉菜单中选择目标板时,IDE会自动包含定义。 - BMelis

1
我在使用 pinMode 和 digitalWrite() 函数时遇到了相同的 wdt 重置错误。通过弄清楚 Wemos 引脚映射的工作原理,我解决了这个问题。实际上,您需要使用 'Dx' 表示法引用引脚。例如:digitalWrite(D15,LOW);
pinMode(D15, OUTPUT);

此外,请确保在“工具”>“板子”中选择“Wemos D1 R1”,以便Dx常量与标签匹配。
请查看Arduino论坛上的对话,了解更多关于wemos引脚映射的信息: https://forum.arduino.cc/index.php?topic=545113.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接