Поворот сервопривода по заданному значению

sava
Offline
Зарегистрирован: 07.07.2016

Добрый день помогите разобраться есть такая задача из приложения написанное на C# передаю значение от 0 до 180 на com-порт на ардуинке хочу считать значение и повернуть серво на этот градус но почему то поворачивается совсем не на тот градус который отправляется в ком порт

if(Serial.available()>0){
    pos=Serial.read();

      myservo.write(pos);

что не так?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нам-то откуда знать как именно Вы свои 180 передаёте? Как байт? Или как строку? ХЗ?

Поставьте после второй строки печать pos (Serial.println(pos);) - увидите, что не так.

sava
Offline
Зарегистрирован: 07.07.2016

да ставил, вместо 1 распечатывает 49 вместо 2 50

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, правильно. Вы передаёте строку, а читаете байт. Либо передавайте байт, либо читайте как строку.

В общем. что передаёте, то и читайте и будет Вам много счастья.

sava
Offline
Зарегистрирован: 07.07.2016

а как в ардуинке читать данные с порта в виде строки?

 

Logik
Offline
Зарегистрирован: 05.08.2014

sava пишет:

да ставил, вместо 1 распечатывает 49 вместо 2 50

49 это 0х31 те аскикод символа "1". Вы передали строкой а приняли числом. Надо чтото менять.

Дз. Незнание основ си.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А как "не в Ардуине" знаете?

100500 способов, откройте наконец описание и посмотрите. readString, например. Или свою pos как char объявите и в массив складывайте. И ещё 100498 способов есть.

sava
Offline
Зарегистрирован: 07.07.2016

 не подскажите почему если в ком порт отправлять с большой переодичностью данные то приходит каша, к римеру отправлю данные от 0 до 50 с шагом 1 но быстро примерно как а цикле с задержкой 100мс а в порт конечное число не 50 приодит а к примеру 205990 или может быть с минумом  

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я не знаю ни как Вы отправляете, ни как читаете.

sava
Offline
Зарегистрирован: 07.07.2016

в C# отправлю строкой значение trackBar

mySerialPort.Write(Convert.ToString(trackBar1.Value));


в ардуино считываю вот так

 if(Serial.available()>0){
 
    pos=Serial.readString();
   
    i=pos.toInt();
       
    myservo.write(i);
    Serial.print(i);

так вот если за бегунок trackBar потнуть быстро тогда в ардуино приодит огромные цифры

phoenixoid
Offline
Зарегистрирован: 14.07.2015

Имхо такие темы нужно сразу переносить в "Ищу исполнителя". Раз человеку лень учить азы пусть платит деньги.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sava пишет:

в C# отправлю строкой значение trackBar

mySerialPort.Write(Convert.ToString(trackBar1.Value));


в ардуино считываю вот так

 if(Serial.available()>0){
 
    pos=Serial.readString();
   
    i=pos.toInt();
       
    myservo.write(i);
    Serial.print(i);

так вот если за бегунок trackBar потнуть быстро тогда в ардуино приодит огромные цифры

И какого типа у Вас pos?

sava
Offline
Зарегистрирован: 07.07.2016

pos типа string

okta
Offline
Зарегистрирован: 10.01.2015

Почитайте про Serial.readString(); о том как она читает (до каких пор).

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Используйте Serial.parseInt()

okta
Offline
Зарегистрирован: 10.01.2015

И проблема останется ровно таже