Arduino and Processing - RX мигает на борту, но светодиод не горит - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь запустить эскиз обработки с моим Arduino.Я получил это несколько дней назад, так что я в значительной степени нуб.Я сделал два одинаковых эскиза - один в Ардуино и один в обработке.Arduino один работает, в то время как эскиз Processing не работает, хотя при запуске Processing на плате загорается RX.

Я подключил светодиод к D9 на плате с помощьюРезистор 220 Ом, и подключил другую ногу к GND.Затем я приступил к запуску эскиза Arduino, который прост: он на секунду загорается и светится светодиодом.Этот работал.

Затем я попытался запустить набросок Обработка, точно такой же код (адаптированный для Обработки), используя библиотеку для Arduino, и доска, кажется, связывается с моим наброском, поскольку RX мигает каждую секунду на плате (япробовал разные интервалы времени, и они совпадают с интервалами, с которыми мигает RX), но светодиод не включается и не выключается, как это было с эскизом Arduino.

Я попытался получить только последовательное соединение между Arduino, и это сработало - я подключил модуль джойстика к Arduino и отправил X и Y через последовательный порт, а эскиз обработки получил информацию через последовательный портпорт, так что они, действительно, обмениваются данными.

Используется порт COM3 и работает на скорости 9600 бод.

Это скриншот Arduino:

void setup() {
  pinMode(9, OUTPUT);
}

void loop() {
  digitalWrite(9, HIGH);
  delay(1000);
  digitalWrite(9, LOW);
  delay(1000);
}

иэто эскиз Обработки (версия 3.4):

import processing.serial.*;
import cc.arduino.*;

Arduino arduino;

void setup() {  
  arduino = new Arduino(this, Arduino.list()[0], 9600);
  arduino.pinMode(9, Arduino.OUTPUT);
}

void draw() {
  arduino.digitalWrite(9, Arduino.HIGH);
  delay(1000);
  arduino.digitalWrite(9, Arduino.LOW);
  delay(1000);
}

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Хорошо сделана пошаговая отладка, такая как двойная проверка электропроводки на стороне электроники и тестирование моргания с одним Arduino, чтобы изолировать проблему.

Если эскиз Blink - это единственный код Arduino, который вы загрузили на свою доску, этого будет недостаточно.Обработка отправляет сообщения в Arduino (именно поэтому вы видите, что светодиод RX включен), но в коде Arduino нет ничего, что инициализирует Последовательная связь

Как вы можете видеть в этом примере,в setup() Последовательная связь инициализируется со скоростью 9600 бод (скорость связи, 9600 байт / символ в секунду):

Serial.begin(9600);

Затем в draw (), если есть доступные данные, каждый символ читается, затемпечатается по одному с префиксным сообщением:

// send data only when you receive data:
        if (Serial.available() > 0) {
                // read the incoming byte:
                incomingByte = Serial.read();

                // say what you got:
                Serial.print("I received: ");
                Serial.println(incomingByte, DEC);
        }

Если вы загрузите пример, связанный, если у вас есть один последовательный порт, вы должны увидеть оба RX, а затем немного позже после индикатора TXмигает при запуске эскиза обработки.Если вы закроете этот эскиз, откройте Serial Monitor в Arduino и наберите что-нибудь, а затем нажмите enter, вы увидите отладочное сообщение, считанное с Arduino.

Используя эти понятия, вы могли бы написать простой эскиз, например, так:

int incomingByte = 0;   // for incoming serial data

void setup() {
  pinMode(9, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // send data only when you receive data:
  if (Serial.available() > 0) {
          // read the incoming byte:
          incomingByte = Serial.read();

          // say what you got:
          Serial.print("I received: ");
          Serial.println(incomingByte, DEC);

          // if we received ASCII character '1', turn LED on
          if(incomingByte == '1'){
            digitalWrite(9,HIGH);
          }
          // if we received ASCII character '0', turn LED off
          if(incomingByte == '0'){
            digitalWrite(9,LOW);
          }
  }
}

Загрузка этого эскиза на Arduino позволит вам набрать 1 в Serial Monitor и нажать Enter, чтобы включить светодиод, или 0, чтобы выключить его.

Осталось только однодля отправки тех же данных из обработки:

import processing.serial.*;

Serial arduino;

void setup(){
  try{
    arduino = new Serial(this, Serial.list()[0], 9600);
  }catch(Exception e){
    println("error connecting to serial port, double chek USB connection, serial port and close other programs using Serial");
    e.printStackTrace();
  }
}

void draw(){

}

void keyPressed(){
  if(key == '1'){
    if(arduino != null){
      arduino.write('1');
    }else{
      println("arduino serial connection wasn't initialised");
    }
    background(255);
  }
  if(key == '0'){
    if(arduino != null){
      arduino.write('0');
    }else{
      println("arduino serial connection wasn't initialised");
    }
    background(0);
  }
}

Незначительное примечание: обратите внимание, что я не использую delay() в обработке, я рекомендую , используя вместо этого millis () , поскольку это не так.не блокирует выполнение кода, как delay() делает.

Таким образом, вышеприведенное выглядит как небольшой кусок кода, просто чтобы мигнуть светодиодом, но смысл в том, чтобы понять основы последовательной связи, которые будут полезны нав долгосрочной перспективе:

  1. инициализация последовательной связи с Arduino (понять скорость передачи в бодах)
  2. базовое чтение / запись байтов по Serial
  3. initialising последовательный обмен данными из обработки и отправки данных

Возвращаясь к исходному вопросу, вы упустили важную деталь, касающуюся библиотеки Arduino, которую вы используете в обработке: она опирается на специальный эскиз Arduino (прошивка) называется Фирмата.Вы сможете прочитать больше об этом и о том, как использовать библиотеку в этом Arduino and Processing учебном пособии.

Как указано в учебном пособии, вам необходимо сначала загрузить этот эскиз из Arduino> Примеры> Фирмы> СтандартФирматы .Кроме того, в качестве скорости передачи установлено значение 57600, а не 9600, поэтому вам необходимо обновить код следующим образом:

arduino = new Arduino(this, Arduino.list()[0], 57600);
0 голосов
/ 29 декабря 2018

Для использования: вы уверены, что поставили стандартные числа

  • Используя программное обеспечение Arduino, загрузите пример StandardFirmata (находится в примерах> Firmata> StandardFirmata) на вашу плату Arduino.

измените строку

arduino = new Arduino(this, Arduino.list()[0], 9600);

на:

arduino = new Arduino(this, "COM3", 57600); // in  Firmata -> Firmata.begin(57600);

Вы можете добавить эту строку для присмотра вашего последовательного порта:

println(Arduino.list());
  • Измените строку «arduino = new Arduino (...)» ниже, изменив номер в Arduino.list () [0] на номер, соответствующий последовательному порту вашей платы Arduino.Кроме того, вы можете заменить Arduino.list () [0] на имя последовательного порта в двойных кавычках, например, «COM3» в Windows или «/dev/tty.usbmodem621» в Mac.
...