Arduino にCharlieplexingを実装しようとしています。現在、3 つの出力を使用して 6 つの LED を制御していますが、問題なく動作しています。問題は、関数の 1 つに遅延を設定すると、このバグが再発することです。このバグにより、多かれ少なかれ関係のない関数に遅延を加えると、(Arduino USB ケーブルを介した) シリアル入力が台無しになります。シリアル ポート経由で 1 ~ 6 の数値を送信して、Charlieplexing アレイを制御しています。
if(Serial.available() > 0)
{
tempChar = 0;
char temp = char(Serial.read());
tempChar = atoi(&temp);
Serial.println(tempChar, DEC);
}
これは整数に変換され、関数によって解釈され、3 つの入力/出力ポートのそれぞれの適切なポート状態に変換されます。
void Charlie(byte input)
{
if(input == 1)
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
digitalWrite(2, 1);
digitalWrite(3, 0);
digitalWrite(4, 0);
}
else if(input == 2)
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
digitalWrite(2, 0);
digitalWrite(3, 1);
digitalWrite(4, 0);
}... (continues to input == 6)
上記は非常にうまく機能しますが、一度に 1 つの LED しか点灯しません。さらにオンにするには、Arduino を LED 間でシフトさせて、一度により多くのものがオンになっているように見せる必要があります。このために、新しい関数を作成しました。
void Range(byte input)
{
if(input == 1)
{
Charlie(1);
}
else if(input == 2)
{
for(byte i = 1; i < 3; i++)
{
Charlie(i);
}
}
else if(input == 3)
{
for(byte i = 1; i < 4; i++)
{
Charlie(i);
delay(4);
}
}... (Continues to input == 6
ここで問題が発生します。Charlie() 関数を呼び出した後に delay() を含めないと、Serial INPUT が壊れます。本当に奇妙なことは、遅延は何もする必要がないということです。別名遅延(0)は私の問題を解決します。
シリアル インターフェイスを介して何らかの入力を送信すると、Arduino はそれを再び吐き出します。したがって、1 から 6 までの数字を送信すると、シリアル コンソールでは次のように表示されます。
1 2 3 4 5 6
それが期待されていることです。適切な遅延なしで Range() 関数を導入すると、出力は次のようになります。
15 25 35 45 55 65
これはプログラムを壊します。
これが漠然としていることはわかっていますが、説明するのは本当に難しいと思います。うまくいけば、それはあなたにとって理にかなっています。
完全なコードはここにあります: http://pastebin.com/t7tdtfid
アップデート
AVR Studio 5 でプログラムを実行してみましたが、問題の影響を受けませんでした。