Помогите с кодом ардуино и visual studio
- Войдите на сайт для отправки комментариев
Пт, 13/11/2020 - 20:39
ДВС. От программирования далек, больше паяю. Но возникла необходимость (или блажь?) в применении ардуины. Уже НЕДЕЛЮ бьюсь над освоением arduino.exe и visual studio, ничего не получается. Может подскажите, покажете что где не так. При раздельном выполнении кодов для сервоприводов x и y проблем нет. Как только объединяю скетчи в один глючит серво x. Он вроде поворачивается согласно положению трекбара, но всё время срывается в положение 0 градусов. И кнопки управления серво y срабатывают через раз.
Собственно скетч ардуино:
#include <Servo.h> // подключаем библиотеку для серво Servo y; // объявляем переменную серво Servo x; int val; // переменная чтения с com int angle; // переменная для угла поворота серво y int xval;// переменная для угла поворота серво x void setup() { Serial.begin(115200); // подключаем com порт y.attach(6); // привязываем серво к выходу 6 y.write(0); x.attach(5); // привязываем серво к выходу 5 x.write(0); } //управление сервой y посредством кнопок с проги с 90 до 0 и обратно void loop() { // проверяем, поступают ли какие-то команды if (Serial.available()) { val = Serial.read(); // переменная val равна полученной команде if (val == 'C') { // цикл для поворота от 0 до 90 градусов при передаче в com с проги буквы С while (angle < 90) // чтоб кнопки в проге не срабатывали по нескольку раз { for (angle = 0; angle <= 90; angle++) { y.write(angle); // сообщаем серво угол поворота delay(20);}} // ждем 20 мс, пока серво не сделает поворот } } if (val == 'D') { // цикл для поворота c 90 до 0 градусов при передаче в com с проги буквы D while (angle > 0) // чтоб кнопки в проге не срабатывали по нескольку раз { for (angle = 90; angle >= 0; angle--) { y.write(angle); // сообщаем серво угол поворота delay(20);}} // ждем 10 мс, пока серво не сделает поворот } } //управление сервой x посредством трекбара с проги для поворота c 0 до 180 void serialEvent() { xval = Serial.parseInt(); if(xval!=0) { x.write(xval); } }
Код студио:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO.Ports; namespace Microscop { public partial class Form1 : Form { SerialPort port; private void init() { port = new SerialPort(); port.PortName = "COM2"; port.BaudRate = 115200; try { port.Open(); } catch (Exception e1) { MessageBox.Show(e1.Message); } } public Form1() { InitializeComponent(); init(); } private void trackBar1_Scroll(object sender, EventArgs e) { port.WriteLine(trackBar1.Value.ToString()); label3.Text = "Угол наклона " + trackBar1.Value.ToString(); } private void button1_Click(object sender, EventArgs e) { port.Write("C"); } private void button2_Click(object sender, EventArgs e) { port.Write("D"); } private void label3_Click(object sender, EventArgs e) { } } }
Хрень получается потому что входящие данные анализируются в двух местах по разным принципам. И срабатывают псевдослучайным образом.
Примерно как ловить в аквариуме с двумя угрями какого-то конкретного, закрыв при этом глаза.
И "где-то" тут исправить невозможно. Нужно просто реализовать правильный алгоритм, а не на трусы пришивать варежки.
Надо что то типа триггера или личного адреса к каждому серво ?
Надо что то типа триггера или личного адреса к каждому серво ?
нет, надо либо управлять серво буквенными командами ( 'D' 'C'), либо цифровыми, но никак не теми и другими сразу
Буду пробовать, спасибо.
и еще вдогонку - читаем сериал либо через Serial.availiable(), либо serialEvent() . А вместе - это как раз "варежки к трусам". как удачно выразился Садман - работать не будет.
У вас вообще весь код просто сшит из двух частей, так не программируют
Я даже подскажу как: шлёшь с компа 0...180 для указания угла, 230, например, вместо D, 240 вместо C.
На Ардуине читаешь байт через read(), если он 230 - нужно совершить действие D, если 240 - действие C, от 0 до 180 - выставить угол поворота сервы. parseInt() со всем обвесом - потереть к чертям.
Я мысль понял.
Спасибо, щас попробую.