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

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

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

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

Что-то есть!

Я написал тестовый скетч и питоновский скрипт для обмена данными через последовательный интерфейс. Сейчас протестил на Arduino UNO - все работает.

Скрипт на питоне открывает порт (у меня COM17) и пишет туда один символ. Потом читает из порта символ и выводит его на экран. Ардуина слушает свой порт, если что-то приходит, то она пересылает эти данные обратно. Получается что-то вроде пинга для проверки serial connection. Скрипт выводит в порт символы от 'a' до 'z' и потом завершается.

Скетч для ардуины:

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

//
// Created: 2012-11-19
// Author: Mr. Kubikus
//

int serialData = 0;
int serialRDYtoSend = 0;

void setup(){
  // Open serial connection.
  Serial.begin(9600);
}

void loop(){ 
  serialRead();
  serialWrite();
} 

void serialRead(void) {
  if (Serial.available()) {
    // Read byte
    serialData = Serial.read();
    serialRDYtoSend = 1;
  }
}

void serialWrite(void) {
  if (serialRDYtoSend) {
    // Write byte + \n
    Serial.write(serialData);
    Serial.println();
    serialRDYtoSend = 0;
  }
}
Скрипт дл питона:

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

'''
Created on 2012-11-19

@author: Mr. Kubikus
'''

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

## open the serial port that your arduino 
## is connected to.
ser = serial.Serial("COM17", 9600)
time.sleep(2)

for x in range(ord('a'), ord('z')+1):
    print '-> ' + str(chr(x))
    ser.write(chr(x))
    data = ser.readline().strip('\n')
    print str(data) + ' <-' + '\n'

## close the port and end the program
ser.close()
Мое тестовое окружение:
  • Win7Prof 64bit
  • Arduino IDE 1.0.1
  • Python 2.7
  • PySerial 2.5
Сейчас поищу в закромах Arduino Mega 2560 и проверю на ней. Позже отпишусь что как.
С уважением, Григорий
GitHub FB ВК
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1019
Зарегистрирован: 22 окт 2010, 23:57

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

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

Нашлась Mega 2560. На ней тоже все ок. Проверяйте у себя.
С уважением, Григорий
GitHub FB ВК
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

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

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

Я проверю Ваши программы обязательно. Думаю все сработает.
Но, я забыл упомянуть одну важную вещь(извиняюсь :oops: )!
Исходники с того сайта работают на моей меге при time.sleep(1), а 1 секунда для пульта - это очень много, как Вы понимаете! При значении меньше 0.85 передачи не происходит. Мега их отправляет, это видно на мониторе порта, а питон не принимает! При этом, если выдернуть мегу из порта, выкидывает ошибку, значит питон мегу видит, но не "слышит"!
Мне нужно time.sleep() минимум(т.е. максимум) 0.1, а то и меньше, если вариант! Иначе весь смысл пульта теряется!
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

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

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

Проверил Ваши скрипты. Все скомпилировалось и записалось. В файле питона поменял порт на свой и запустил. Буквы питон отправляет меге, мега отправляет обратно(загораются оба светодиода на меге), но в терминале не отображается.
Вывод так:

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

-> a
<-

-> b
<-
Но это не важно, тут видно, что обмен происходит!

Если Вас не затруднит, напишите скрипты, чтоб при нажатии на кнопку на меге, в терминале отображалось "1", при отпускании "0"
Так можно будет проверить скорость срабатывания!
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1019
Зарегистрирован: 22 окт 2010, 23:57

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

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

Исходники с того сайта работают на моей меге при time.sleep(1), а 1 секунда для пульта - это очень много, как Вы понимаете!
Вот тут я немного не понял, почему вам мешает time.sleep(1)?
Если Вас не затруднит, напишите скрипты, чтоб при нажатии на кнопку на меге, в терминале отображалось "1", при отпускании "0"
Так можно будет проверить скорость срабатывания!
Это можно. Отпишу немного позже.
С уважением, Григорий
GitHub FB ВК
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

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

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

Mr.Kubikus писал(а): Вот тут я немного не понял, почему вам мешает time.sleep(1)?
В том скетче прописан бесконечный цикл и эта команда стоит в конце, как пауза между циклами передачи. Почему это влияет, я не понимаю!
И там стоит время паузы 0.0001 если не ошибаюсь, и сделано на 6 циклов передач от меги приходится 1 передача от компа. Но так как пауза ничтожно мала, это не заметно! Но когда я поставил 1 секунду, получилось соответственно 1:6 секунд, а это огог как много.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1019
Зарегистрирован: 22 окт 2010, 23:57

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

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

Готово.

Питон:
Скрипт открывает порт и затем начинает в цикле считывать данные. При поступлении данных выводит их на экран.
Ардуино:
Настраиваем цифровой порт D2. Затем в цикле опрашиваем его состояние. Если "1", то пишем в последовательный порт символ '1'. Если "0", то символ '0'. Задержка 50 мс сделана для того чтобы не переполнять буффер выходных данных последовательного порта.

Скетч для Arduino:

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

//
// Created: 2012-11-20
// Author: Mr. Kubikus
//

int buttonPin = 2;
int serialData = 0;
int serialRDYtoSend = 0;

void setup(){
  pinMode(buttonPin,  INPUT_PULLUP);
  // Open serial connection.
  Serial.begin(9600);
}

void loop(){ 
  if (digitalRead(buttonPin)) {
    serialWrite('1');
  } else {
    serialWrite('0');
  }
  delay(50);
} 

void serialWrite(char writeData) {
    // Write byte + \n
    Serial.write(writeData);
    Serial.println();
}
Скрипт для питона:

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

'''
Created on 2012-11-20

@author: Mr. Kubikus
'''

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

## open the serial port that your arduino 
## is connected to.
ser = serial.Serial("COM17", 9600)
time.sleep(2)

for x in range(1, 500):
    data = ser.readline().strip('\n')
    print str(data) + ' <-'

## close the port and end the program
ser.close()
В питоновском скрипте time.sleep(2)используется только один раз в момент инициализации последовательного порта. В цикле никаких задержек нет. Зачем этот вызов у вас стоит в цикле мне не понятно.
С уважением, Григорий
GitHub FB ВК
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

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

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

Проверить смогу только завтра, мега и комп с линуксом у меня только на работе!
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1019
Зарегистрирован: 22 окт 2010, 23:57

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

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

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

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

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

Так, записал Ваши скрипты и запустил, сначала не заработало. Мега данные отправляла а питон не реагировал.
После того как убрал в файле питона цикл for и прописал вместо него бесконечный цикл, все заработало. :)

Теперь, нужно в меге сделать пакет из 10 бит, присвоить их входам меги с D2 по D12(кнопки ), отправить их питону и в питоне присвоить их значения переменным in1-in10.
Вообще-то, я думаю экономичней ресурсов меги было бы отправлять данные по изменению какого либо из входов, но это для меня пока сложновато. Или отправлять только значение изменившейся переменной, но здесь к этому значению нужен будет префикс для опознавания переменной.
Чето меня понесло в дебри программирования... :?
Пока остановимся на первом варианте с отправкой пакета из10 бит.
Я завтра работаю в ночную смену, буду эксперементировать...
Ответить