Новичок просит помощи! mega 2560

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Новичок просит помощи! mega 2560

Сообщение Mr.Kubikus »

То есть теперь скорость обновления данных на стороне питона нормальная? Я правильно понимаю?
С уважением, Григорий
GitHub FB ВК
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

Re: Новичок просит помощи! mega 2560

Сообщение Тима »

Да, скорость оболденная! Я не успеваю нажать на кнопку так, чтоб в терминале выскочила только одна единица. За одно короткое нажатие выскакивает 2-3 единички!
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

Re: Новичок просит помощи! mega 2560

Сообщение Тима »

Получилось отправить пакетом данные о состоянии 5и входов, питон их принимает. И выводит так:

Код: Выделить всё

00000
00000
10000
10000
01000
01000
Единица - при нажатии кнопки соответствующего пина.


Вот скрипты:

Для ардуино:

Код: Выделить всё

int myPins[] = {2, 3, 4, 5, 6};  // определение входных пинов

void setup(){
Serial.begin(9600); // установка скорости порта
}

void loop(){
  
if (Serial.available()) { // проверка подключения к порту
int i;
for (i = 0; i < 5; i = i + 1) { // перебираем входа
  
  Serial.print(digitalRead(myPins[i])); // отправляем в порт 
  
}
delay(50); // делаем паузу
}
}
Для питона:

Код: Выделить всё

## import the serial library
import serial
import time
import string

## open the serial port that your arduino 
## is connected to.
PORT = "/dev/ttyACM0"
ser = serial.Serial(PORT, 9600, timeout=2)

while 1:
    ser.write(' ')    
    data = ser.read(5)
    print str(data)

## close the port and end the program

В питоне в начале бесконечного цикла сделал отправку в порт пробела, чтоб ардуина поняла когда начинать передавать данные, а то получалось что ардуина начинала передавать данные как только подключить питание, а питон не всегда попадал в начало цикла и получался сдвиг данных!

Теперь вопрос: мега по команде от компа(отправка пробела) отправляет пакет данных компу! Как биты этого пакета присвоить разным булиевым переменным(к примеру х1, х2, х3, х4 и х5)?
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

Re: Новичок просит помощи! mega 2560

Сообщение Тима »

Прошу посмотреть этот скетч:

Код: Выделить всё

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int in=0;
int ledPin=13;
 
void setup()
{  
  Serial.begin(9600);
  pinMode(ledPin,OUTPUT); 
}
void loop()
{  
  if (Serial.available() )
  {
    
    in = Serial.read();
    lcd.setCursor(4, 1);
     lcd.print("X = " );
     lcd.print(in);
     delay(10);
    
    if (in=='1')
    {
      digitalWrite(ledPin, HIGH);
    }    
    if (in=='0')
    {
      digitalWrite(ledPin, LOW);
    }
  }
}
при отправке с монитора порта "1" светодиод загорается, но на экран выводит почему-то "49", при отправке "0" светодиод гаснет и на экран выводит "48"
Почему так?
З.Ы. ардуино-нано и экран LCD-2004
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Новичок просит помощи! mega 2560

Сообщение Mr.Kubikus »

Объявите переменную in как char весто int.
С уважением, Григорий
GitHub FB ВК
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

Re: Новичок просит помощи! mega 2560

Сообщение Тима »

Сработало! Спасибо!
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

Re: Новичок просит помощи! mega 2560

Сообщение Тима »

Так, с выводом на экран разобрался.
Но при передаче 2х и более значений, он отображает их поочереди. Теперь, чтоб передавать многозначные значения(к примеру abc,de), надо будет разбивать его на отдельные цифры, формировать пакет и передавать... и нужна еще метка. В итоге получится пакет: метка координаты "Х", 3 цифры целой части и 2 дробной. И мы получается пакет из 6 знакомест для одной координаты. При получении данных ардуина ищет метку и забивает в один массив следующие за ней 5 значений, после 1е значение умножаем на 100, 2е на 10, 4е на 0.1, 5е на 0.01 и выводим сумму всех значений на экран...
Нужна помощь, как это правильно организовать?
Или есть какой нибудь способ по-проще?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Новичок просит помощи! mega 2560

Сообщение Mr.Kubikus »

Не очень понял задачу, которую требуется решить. Что такое многозначные значения?
С уважением, Григорий
GitHub FB ВК
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

Re: Новичок просит помощи! mega 2560

Сообщение Тима »

Ситуация такая: Я пытаюсь сделать пульт на ардуине для станка с чпу. На экране пульта должны отображаться координаты по 3м осям и скорость шпинделя! Координата - это число из 3х цифр целой части и 2х цифр дробной(к примеру 123.45). Это я и назвал многозначным значением. И это значение надо передать с компа и отобразить на экране пульта!
Как это мне видится, я описал здесь:
Тима писал(а):Так, с выводом на экран разобрался.
Но при передаче 2х и более значений, он отображает их поочереди. Теперь, чтоб передавать многозначные значения(к примеру abc,de), надо будет разбивать его на отдельные цифры, формировать пакет и передавать... и нужна еще метка. В итоге получится пакет: метка координаты "Х", 3 цифры целой части и 2 дробной. И мы получается пакет из 6 знакомест для одной координаты. При получении данных ардуина ищет метку и забивает в один массив следующие за ней 5 значений, после 1е значение умножаем на 100, 2е на 10, 4е на 0.1, 5е на 0.01 и выводим сумму всех значений на экран...
Нужна помощь, как это правильно организовать?
Или есть какой нибудь способ по-проще?
Если есть более простой путь реализации данной задачи, буду только рад!
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Новичок просит помощи! mega 2560

Сообщение Mr.Kubikus »

Используйте метод lcd.print(x,n), где:
x - переменная типа float в которой хранится значение для вывода на LCD
n - количество знаков после точки при выводе на LCD

Попробуйте следующий рецепт:

Код: Выделить всё

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Измените в соответствии с вашим подключением

void setup()
{
    lcd.begin(20, 2); // Укажите размеры вашего ЖКИ
}

void loop()
{
    lcd.clear();
    float x = 123.123;
    float y = 123.123;
    float z = 123.123;
    float s = 123.123;

    lcd.setCursor(0, 0);
    lcd.print("X="); lcd.print(x,2);

    lcd.setCursor(10, 0);
    lcd.print("Y="); lcd.print(y,2);

    lcd.setCursor(0, 1);
    lcd.print("Z="); lcd.print(z,2);

    lcd.setCursor(10, 1);
    lcd.print("S="); lcd.print(s,2);

    delay(100);
} 
С уважением, Григорий
GitHub FB ВК
Ответить