Обработка не отвечает на ардуино
Прежде всего, если я делаю неправильное предложение, это потому, что мой основной язык не английский. У меня есть домашнее задание, поэтому я пытаюсь сделать радар с помощью Arduino IDE и Processing. Я нашел и записал коды из Интернета, но обработка не реагирует на ультразвуковой датчик, и я подумал, что, возможно, он не обнаруживает последовательный порт. Код из обработки:
import processing.serial.*; // импортирует библиотеку для последовательной связи
import java.awt.event.KeyEvent; // импортирует библиотеку для чтения данных из последовательного порта
import java.io.IOException;
Serial myPort; // определяет серийный номер объекта
// обезвреживает переменные
String angle="";
String distance="";
String data="";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1=0;
int index2=0;
PFont orcFont;
void setup() {
size (1600, 900); // ***ИЗМЕНИТЕ ЭТО НА ВАШЕ РАЗРЕШЕНИЕ ЭКРАНА***
smooth();
myPort = new Serial(this,"COM3", 9600); // запускает последовательную связь
myPort.bufferUntil('.'); // считывает данные из последовательного порта до символа '.'. Так что на самом деле это читается так: угол, расстояние.
orcFont = loadFont("Calibri-Bold-48.vlw");
}
void draw() {
fill(98,245,31);
textFont(orcFont);
// имитация размытия в движении и медленное затухание движущейся линии
noStroke();
fill(0,4);
rect(0, 0, width, height-height*0.065);
fill(98,245,31); // зеленого цвета
// вызывает функции отрисовки радара
drawRadar();
drawLine();
drawObject();
drawText();
}
void serialEvent (Serial myPort) { // начинаем считывать данные из последовательного порта
// считывает данные из последовательного порта до символа '.' и помещает его в строковую переменную "data".
data = myPort.readStringUntil('.');
data = data.substring(0,data.length()-1);
index1 = data.indexOf(","); // находим символ ',' и помещаем его в переменную "index1"
angle= data.substring(0, index1); // считываем данные с позиции "0" в положение переменной index1 или это значение угла, которое плата Arduino отправила в последовательный порт
distance= data.substring(index1+1, data.length()); // считываем данные с позиции "index1" до конца данных pr это значение расстояния
// преобразует строковые переменные в целые
iAngle = parseInt(angle);
iDistance = parseInt(distance);
}
void drawRadar() {
pushMatrix();
translate(width/2,height-height*0.074); // перемещает начальные координаты в новое место
noFill();
strokeWeight(2);
stroke(98,245,31);
// рисует линии дуги
arc(0,0,(width-width*0.0625),(width-width*0.0625),PI,TWO_PI);
arc(0,0,(width-width*0.27),(width-width*0.27),PI,TWO_PI);
arc(0,0,(width-width*0.479),(width-width*0.479),PI,TWO_PI);
arc(0,0,(width-width*0.687),(width-width*0.687),PI,TWO_PI);
// рисуем линии углов
line(-width/2,0,width/2,0);
line(0,0,(-width/2)*cos(radians(30)),(-width/2)*sin(radians(30)));
line(0,0,(-width/2)*cos(radians(60)),(-width/2)*sin(radians(60)));
line(0,0,(-width/2)*cos(radians(90)),(-width/2)*sin(radians(90)));
line(0,0,(-width/2)*cos(radians(120)),(-width/2)*sin(radians(120)));
line(0,0,(-width/2)*cos(radians(150)),(-width/2)*sin(radians(150)));
line((-width/2)*cos(radians(30)),0,width/2,0);
popMatrix();
}
void drawObject() {
pushMatrix();
translate(width/2,height-height*0.074); // перемещает начальные координаты в новое место
strokeWeight(9);
stroke(255,10,10); // красный цвет
pixsDistance = iDistance*((height-height*0.1666)*0.025); // покрывает расстояние от сенсора от см до пикселей
// ограничение диапазона до 40 см
if(iDistance<40){
// рисует объект по углу и расстоянию
line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),(width-width*0.505)*cos(radians(iAngle)),-(width-width*0.505)*sin(radians(iAngle)));
}
popMatrix();
}
void drawLine() {
pushMatrix();
strokeWeight(9);
stroke(30,250,60);
translate(width/2,height-height*0.074); // перемещает начальные координаты в новое место
line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle))); // рисует линию по углу
popMatrix();
}
void drawText() { // рисует текст на экране
pushMatrix();
if(iDistance>40) {
noObject = "Out of Range";
}
else {
noObject = "In Range";
}
fill(0,0,0);
noStroke();
rect(0, height-height*0.0648, width, height);
fill(98,245,31);
textSize(25);
text("10cm",width-width*0.3854,height-height*0.0833);
text("20cm",width-width*0.281,height-height*0.0833);
text("30cm",width-width*0.177,height-height*0.0833);
text("40cm",width-width*0.0729,height-height*0.0833);
textSize(40);
text("Obje: " + noObject, width-width*0.875, height-height*0.0277);
text("Açı: " + iAngle +" °", width-width*0.48, height-height*0.0277);
text("Mesafe: ", width-width*0.26, height-height*0.0277);
if(iDistance<40) {
text(" " + iDistance +" cm", width-width*0.225, height-height*0.0277);
}
textSize(25);
fill(98,245,60);
translate((width-width*0.4994)+width/2*cos(radians(30)),(height-height*0.0907)-width/2*sin(radians(30)));
rotate(-radians(-60));
text("30°",0,0);
resetMatrix();
translate((width-width*0.503)+width/2*cos(radians(60)),(height-height*0.0888)-width/2*sin(radians(60)));
rotate(-radians(-30));
text("60°",0,0);
resetMatrix();
translate((width-width*0.507)+width/2*cos(radians(90)),(height-height*0.0833)-width/2*sin(radians(90)));
rotate(radians(0));
text("90°",0,0);
resetMatrix();
translate(width-width*0.513+width/2*cos(radians(120)),(height-height*0.07129)-width/2*sin(radians(120)));
rotate(radians(-30));
text("120°",0,0);
resetMatrix();
translate((width-width*0.5104)+width/2*cos(radians(150)),(height-height*0.0574)-width/2*sin(radians(150)));
rotate(radians(-60));
text("150°",0,0);
popMatrix();
}
Код из Arduino IDE:
#include <Servo.h> // библиотека серводвигателей
#define trigPin 4 // триггерный контакт ультразвукового датчика
#define echoPin 3 // эхо-вывод ультразвукового датчика
Servo servoMotor; // объект серводвигателя
int angle = 0; // угол серводвигателя
long duration, distance; // расстояние ультразвукового датчика
void setup() {
Serial.begin(9600); // скорость последовательной связи
servoMotor.attach(9); // номер вывода серводвигателя
}
void loop() {
for(angle = 0; angle < 180; angle += 10){ // углы серводвигателя
servoMotor.write(angle); // двигаем серводвигатель
delay(200); // Время ожидания
distance = getDistance(); // измерение расстояния
Serial.print(angle); // напечатать угол
Serial.print(",");
Serial.println(distance); // печатаем расстояние
}
}
long getDistance(){ // измерение расстояния ультразвуковым датчиком
pinMode(trigPin, OUTPUT);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
distance = duration / 58.2;
return distance;
}
Спасибо за помощь!
@Earas, 👍3
Обсуждение1 ответ
▲ 1
Ваш код обработки ищет что-то, что заканчивается на '.'
Ваш код Arduino посылает угол,расстояние[новая строка]
Поэтому либо измените свой код обработки, чтобы искать '\n' (символ новой строки), а не '.' или измените свой код Arduino, чтобы добавить файл . до конца:
Serial.print(angle);
Serial.print(",");
Serial.print(distance);
Serial.print(".");
,
@Andrew
Смотрите также:
- Подключить генератор функций к Arduino
- ШИМ-сигнализация с Arduino: для чего использовать землю?
- Отправка символа «А» посредством мигания светодиода
- Сдвиг фазы квадратной волны Arduino на 270 градусов
- связь между двумя arduino с помощью ENC28J60?
- Подключение функционального генератора к Arduino
- Обнаружение пиковой частоты в выходном сигнале микрофона
- создание анализатора гармоник мощности, который будет измерять амплитуды основной и кратных ей частот (например, 50 Гц, 100 Гц, 150 Гц, 200 Гц,...)
скетч обработки здесь не имеет значения ... откройте последовательный монитор Arduino IDE, чтобы определить, правильные ли данные отправляются Arduino, @jsotola
можете ли вы дать мне более подробную информацию. Как я уже сказал, я не слишком много знаю английский, и я новичок в arduino ide. А в последовательном мониторе только угол, @Earas