10

送信されたものを検出し、押されたキーに応じて正しいピンをオンにするarduinoにデータを送信するプログラムを作成しました。

Windows コンピューターから arduino ソフトウェアを使用すると、arduino スケッチは正常に動作します。WAS または D を送信することで、各ピンをオンまたはオフにすることができます。

ノード経由で送信すると、arduino の RX ライトが点滅しますが、他に何も起こりません。

誰でも助けることができますか?

Node.js プログラム:

var httpServer = require('http').createServer(function(req, response){ /* Serve your static files */ })
httpServer.listen(8080);

var nowjs = require("now");
var everyone = nowjs.initialize(httpServer);

everyone.now.logStuff = function(msg){
    console.log(msg);
}

var SerialPort = require('serialport2').SerialPort;
var assert = require('assert');

var portName;

if (process.platform == 'win32') {
  portName = 'COM4';
} else if (process.platform == 'darwin') {
  portName = '/dev/cu.usbserial-A800eFN5';
} else {
  portName = '/dev/ttyUSB0';
}

var readData = '';
var sp = new SerialPort();

sp.on('close', function (err) {
  console.log('port closed');
});

sp.on('error', function (err) {
  console.error("error", err);
});

sp.on('open', function () {
  console.log('port opened... Press reset on the Arduino.');
});

sp.open(portName, {
  baudRate: 9600,
  dataBits: 8,
  parity: 'none',
  stopBits: 1,
  flowControl: false
});

everyone.now.forward = function() {
sp.write("w");
}

everyone.now.back = function() {
sp.write("s");
}

everyone.now.left = function() {
sp.write("a");
}

everyone.now.right = function() {
sp.write("d");
}

sp.on('data', function(data) {
  console.log(data.toString());
});

Arduino プログラム:

void setup(){
  Serial.begin(9600);
  Serial.write("READY");
  //Set all the pins we need to output pins
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop (){
  if (Serial.available() > 0) {

    //read serial as a character
    char ser = Serial.read();
    Serial.write(ser);
    //NOTE because the serial is read as "char" and not "int", the read value must be compared to character numbers
    //hence the quotes around the numbers in the case statement
    switch (ser) {
      case 'w':
        move(8);
        break;
      case 's':
        move(9);
        break;
      case 'a':
        move(10);
        break;
      case 'q':
        move(10);
        move(8);        
        break;
      case 'd':
        move(11);
        break;
      case 'e':
        move(11);
        move(8);
        break;
    }
  }
}

void move(int pin){
  Serial.print(pin);  
  digitalWrite(pin, HIGH);
  delay(1);
  digitalWrite(pin, LOW);
}
4

4 に答える 4

9

私は最近これに手を出しました。Arduino IDE 以外のほとんどのものからシリアル通信を受信すると、Arduino は自動的にリセットされます。これが、node.js ではなく IDE から送信できる理由です。

私は Uno を持っていて、Reset と Ground の間にコンデンサーを入れています。
幸運を。 http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

于 2012-06-06T20:39:05.850 に答える
1

コンデンサとリセットの問題について...後のモデルのArduinoでは、シリアル制御ラインの1つとリセットの間に小さなコンデンサがあります。このコンデンサは、ポートが開いているときに Arduino をリセットしますが、それ以外の場合は通常のシリアル操作を妨げません。

このリセット トリックにより、コードのアップロードで、アップロード プロセスの一部として Arduino をリセットできます。Arduino が起動すると、ロードされたコードが実行される前に、コード ブート ローダーが最初に短時間実行されます。

アップロード プロセスは次のとおりです。ブート ローダーを起動する Arduino をリセットし、Arduino IDE でアップロード プロセスを開始し、通信を確立してアップロードし、ロードしたコードを実行します。Arduino が起動すると、アップロードを短時間待ちます。何も受信されない場合は、コードの実行に進みます。

ポートを閉じて開くだけでArduinoを効果的にリセットできるので、これは非常に便利です。古い Arduino では、このコンデンサがなければ、適切なタイミングでリセット ボタンを押してコードをアップロードする必要がありました。そしてタイミングは、Arduino がアップロードされたコードで開始する前に、はるかに多くの時間を待機するようなものでした。

ここで説明されている問題では、使用されたリセット トリックが原因で問題が発生したとは思いません。彼がシリアルポートを開いたときに Arduino をリセットする効果しかなかったはずであり、彼の情報を見ると、これは望ましい副作用です。

于 2013-01-09T18:34:02.103 に答える