Arduino Serial не разбирает команды

Я использую Processing (java) для связи через последовательный порт с Arduino, который управляет двумя сервоприводами и лазером. Все работает независимо, однако, когда я включаю лазер с помощью Обработки, я не могу управлять сервоприводами, пока я не выключу лазер.
Устранение неполадок, которые я пробовал:

  1. Отправка команд в Arduino вручную с помощью Arduino Serial или
    Шпатлевка приводит к тому, что Arduino работает как положено (сервоуправление
    независимо от лазерного статуса)
  2. Помещение Arduino в конфигурацию последовательного моста для мониторинга того, что
    Обработка последовательных команд отправляется на Arduino, и это как
    ожидается (положение двигателя, состояние лазера)
  3. Я использую внешний источник питания, поэтому я знаю, что это не
    Максимальная текущая ничья. (и это работает
  4. Включены задержки в обработке, очистка буфера Arduino.
  5. Использованы все комбинации «\ n», «\ r», «\ r \ n».

Вот моя программа обработки:

import processing.serial.*;
import org.gamecontrolplus.gui.*;
import org.gamecontrolplus.*;
import net.java.games.input.*;

String ard_ser = "/dev/ttyACM0";

ControlIO control;
ControlDevice stick;
float px, py;
int deg_x, deg_y;
boolean trailOn;
Serial myPort;
ArrayList<PVector>  shadows = new ArrayList<PVector>();
ArrayList<PVector>  trail = new ArrayList<PVector>();

public void setup() {
size(400, 400);
myPort = new Serial(this, Serial.list()[0],9600);
printArray(Serial.list());

// Initialise the ControlIO
control = ControlIO.getInstance(this);
// Find a device that matches the configuration file
stick = control.getMatchedDevice("joystick");
if (stick == null) {
println("No suitable device configured");
System.exit(-1); // End the program NOW!
}
// Setup a function to trap events for this button
stick.getButton("LASER").plug(this, "toggleLaser", ControlIO.ON_PRESS);
}

// Poll for user input called from the draw() method.
public void getUserInput() {
px = map(stick.getSlider("X").getValue(), -1, 1, 0, width);
deg_x = int(map(stick.getSlider("X").getValue(),-1,1,0,180));
py = map(stick.getSlider("Y").getValue(), -1, 1, 0, height);
deg_y = int(map(stick.getSlider("Y").getValue(),-1,1,0,180));
//stick.getButton("LASER").plug(this,"toggleLaser",ControlIO.);
}

// Event handler for the Laser button
public void toggleLaser() {
println("laser");
if (myPort.available()>0){
myPort.write("-1\n");
}
//delay(1000);
return;
}public void draw() {
getUserInput(); // Polling
background(255, 255, 240);
// Draw shadows
fill(0, 0, 255, 32);
noStroke();
for (PVector shadow : shadows)
ellipse(shadow.x, shadow.y, shadow.z, shadow.z);

if ( trail.size() > 1) {
stroke(132, 0, 0);
for (int n = 1; n < trail.size(); n++) {
PVector v0 = trail.get(n-1);
PVector v1 = trail.get(n);
line(v0.x, v0.y, v1.x, v1.y);
v0 = v1;
}
}
// Show position
noStroke();
fill(255, 64, 64, 64);
ellipse(px, py, 20, 20);
String position = str(deg_x)+','+str(deg_y)+'\n';
if (myPort.available()>0){
//println(position);
myPort.write(position);
}
delay(10);
}

Он имеет небольшую визуализацию для отслеживания местоположения двигателя и в основном просто отправляет «mot_x_pos, mot_y_pos \ n» и «-1 \ n» для переключения лазера.
Пример выходного последовательного потока:

90,90\n
50,50\n
-1\n

Код Arduino анализирует поток и управляет двигателями / лазером:

#include <Servo.h>
bool laser = true;
// true sets the value high (off for my transistor)
char val = 0;
const int laser_pin = 7;
int out1 = 9;    //servo pins
int out2 = 11;
boolean newData= true;
Servo servo_x;
Servo servo_y;
int pos_x =0;
int pos_y =0;
int x_prev = 90;
int y_prev = 90;

void setup() {
Serial.begin(9600);
Serial.println("<Arduino is ready>");
servo_x.attach(out1);
servo_y.attach(out2);
pinMode(laser_pin, OUTPUT);
digitalWrite(laser_pin, laser); //turn laser off on startup
}

void loop(){
while(Serial.available()>0){
pos_x = Serial.parseInt();
pos_y = Serial.parseInt();
val = Serial.read();  // this catches the newline escape characters
if ( (pos_x<0) || (pos_y<0) ){
//toggle laser
if(laser){
laser = false;
}
else {laser = true;}
digitalWrite(laser_pin, laser);
}
else if( (val == '\n') || (val == '\r')  ){
if(pos_x != x_prev){       //only write to the motors if something has changed
servo_x.write(pos_x);
x_prev = pos_x;
}
if(pos_y != y_prev){
servo_y.write(pos_y);
y_prev = pos_y;
}
}
}
}

Любые предложения будут оценены, спасибо.

-1

Решение

Помогло бы, если бы вы предоставили последовательность команд, которая не работает.

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

Пытаться

  1. Когда ваша лазерная кнопка отправляет «-1, -1», все строки имеют два числа
  2. Лучше создайте лучше структурированный формат для ваших строк: начните с буквы, в которой говорится, является ли это серво или лазерной командой, затем прочитайте, что нужно, затем убедитесь, что вы нашли ‘\ n’, а затем повторите.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]