从NodeJS控制Arduino

时间:2013-10-04 05:34:03

标签: javascript node.js serial-port arduino npm

我正在尝试从NodeJS控制Arduino。

我已经尝试过 Duino ,我知道设备已准备就绪,调试器显示命令已经发送到Arduino,但没有任何反应。

我还尝试了 Johnny-Five ,它显示设备已连接(在COM8上),但on ready事件从未被触发。

请帮忙! 感谢..

1 个答案:

答案 0 :(得分:3)

我或许可以帮助你,你必须更具体地了解你真正想做的事情?

您想阅读数据吗?你想远程控制吗?

修改 我也使用Node来控制Arduino但是我没有使用Duino也没有使用Johnny-Five,因为它不适合我的项目。

相反,我在计算机和机器人之间建立了自己的通信协议。

在Arduino上,代码很简单。它检查串行是否可用,如果可用,则读取并存储缓冲区。使用switchif/else我然后选择我希望机器人执行的动作(向前移动,向后移动,闪烁等等)

通过发送bytes而非人类可读的操作进行通信。所以你要做的第一件事就是设想两者之间的小接口。 Bytes非常有用,因为在Arduino方面,您不需要任何转换,它们可以与switch一起使用,而字符串不是这样。

在Arduino方面,你会有类似的东西:(注意你需要在某处声明DATA_HEADER

void readCommands(){
    while(Serial.available() > 0){

        // Read first byte of stream.
        uint8_t numberOfActions;
        uint8_t recievedByte = Serial.read();

        // If first byte is equal to dataHeader, lets do
        if(recievedByte == DATA_HEADER){
            delay(10);

            // Get the number of actions to execute
            numberOfActions = Serial.read();

            delay(10);

            // Execute each actions
            for (uint8_t i = 0 ; i < numberOfActions ; i++){

                // Get action type
                actionType = Serial.read();

                if(actionType == 0x01){
                    // do you first action
                }
                else if(actionType == 0x02{
                    // do your second action
                }
                else if(actionType == 0x03){
                    // do your third action
                }
            }
        }
    }
}

在节点方面,你会有类似的东西:(查看serialport github了解更多信息)

var dataHeader = 0x0f, //beginning of the data stream, very useful if you intend to send a batch of actions
myFirstAction = 0x01,
mySecondAction = 0x02,
myThirdAction = 0x03;

sendCmdToArduino = function() {
    sp.write(Buffer([dataHeader]));

    sp.write(Buffer([0x03])); // this is the number of actions for the Arduino code

    sp.write(Buffer([myFirstAction]));
    sp.write(Buffer([mySecondAction]));
    sp.write(Buffer([myThirdAction]));
}

希望它有所帮助!