【问题标题】:Why is my Arduino freezing when using a relay board?为什么我的 Arduino 在使用继电器板时会冻结?
【发布时间】:2014-04-07 16:50:05
【问题描述】:

我正在做一个项目,我使用 Arduino Uno 使用 midi 音符来切换 8 个旧灯。我已经构建了一个带有 8 个墙壁插座的机箱,这些插座连接到 Arduino 的继电器板。我正在使用Hairless midi serial bridge 通过 USB 向 Arduino 发送 midi 音符。

这一切都有效,直到我用我的 Uno 给插座通电。大约 5~10 秒后,Arduino 冻结。继电器屏蔽保持在当前状态,串行通信指示灯停止闪烁。当没有 220 伏通过继电器时,一切正常。

(我的示意图如下。)Arduino 通过 USB 供电。我还尝试使用 5V 和 500mA 的附加适配器为 Arduino 供电,但这并没有什么不同。

代码:

#include <digitalWriteFast.h>

byte incomingByte=0;
byte notebyte=0;
byte velocitybyte=0;
byte statusbuffer=0;
byte NOTE_ON = 144;
byte NOTE_OFF = 128;
boolean arp_triggernext=false;
boolean firstbyte;
void MIDI_Poll(){
  if (Serial.available() > 0) {
    do {
      // read the incoming byte:
      incomingByte = Serial.read();
      if (incomingByte>247) {
        // this is where MIDI clock stuff is done
        switch (incomingByte){
        }
      }
      else if (incomingByte>240) {
        statusbuffer = 0;
        //sysex stuff done here
      }
      else if (incomingByte>127) {
        statusbuffer = incomingByte;
        firstbyte = true;
        notebyte = 0;
        velocitybyte = 0;
      }
      else if (statusbuffer!=0) {
        if (firstbyte == true) {
          // must be first byte
          notebyte = incomingByte;
          firstbyte = false;
        }
        else {
          // so must be second byte then
          velocitybyte = incomingByte;
          //process the message here
          if (statusbuffer == NOTE_ON && velocitybyte != 0) {
            switch (notebyte) {
               case 60:
               digitalWriteFast2(2, HIGH);
               break;
               case 61:
               digitalWriteFast2(3, HIGH);
               break;
               case 62:
               digitalWriteFast2(4, HIGH);
               break;
               case 63:
               digitalWriteFast2(5, HIGH);
               break;
               case 64:
               digitalWriteFast2(6, HIGH);
               break;
               case 65:
               digitalWriteFast2(7, HIGH);
               break;
               case 66:
               digitalWriteFast2(8, HIGH);
               break;
               case 67:
               digitalWriteFast2(9, HIGH);
               break;
            }
          }
          else if (statusbuffer == NOTE_OFF || (statusbuffer == NOTE_ON && velocitybyte == 0)) {
            switch (notebyte){
               case 60:
               digitalWriteFast2(2, LOW);
               break;
               case 61:
               digitalWriteFast2(3, LOW);
               break;
               case 62:
               digitalWriteFast2(4, LOW);
               break;
               case 63:
               digitalWriteFast2(5, LOW);
               break;
               case 64:
               digitalWriteFast2(6, LOW);
               break;
               case 65:
               digitalWriteFast2(7, LOW);
               break;
               case 66:
               digitalWriteFast2(8, LOW);
               break;
               case 67:
               digitalWriteFast2(9, LOW);
               break;
            }
          }
          //now clear them for next note
          notebyte = 0;
          velocitybyte = 0;
          firstbyte = true;        
        }
      }
    } while (Serial.available() > 0);
  }
}

void setup() {      

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  MIDI_Poll();
}

它基于我发现的用于处理串行 MIDI 的代码。

我真的很困惑为什么会发生这种情况。我想知道为什么当有 220 伏电压通过继电器时,我的 Arduino 和继电器板会冻结。

材料:

【问题讨论】:

  • 当你的意思是“它在没有电源通过时工作得很好”,你的意思是它在电源应该流动时冻结(不管它们是否连接)或者当它们被连接时物理连接?
  • 仅供参考。现在有一个专用于 Arduino 的堆栈 arduino.stackexchange.com
  • 确保所有地面均处于同一电位
  • Annomus Person:我的意思是当没有 220 伏电压通过时,继电器会完美切换。所以基本上这些开关会一直工作,直到它们真正切换带电电路。
  • 这个问题似乎是题外话,因为它是关于电子设计而不是代码,所以它应该被重定向到 EE stackexchange!

标签: arduino


【解决方案1】:

我在这里看到的是一些电路问题,所以我将一一解释 1. 你不应该直接从 Arduino 引脚运行继电器,所以使用适当的电路和晶体管来运行继电器,并使用 arduino 引脚作为接收器而不是源会更好。 2.使用带继电器线圈的续流二极管。 3.在Rx和Tx使用光隔离器。

【讨论】:

    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 2022-01-16
    • 2021-04-25
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多