1 1 1 1 1 Rating 4.67 (3 Votes)

Для подключения к роутеру я использовал arduino UNO, как оказалось она имеет не стандартный ftdi чип для com порта, а чип atmega16u2. Поэтому для него необходим другой драйвер на openwrt. Для данного эксперимента я использовал роутер wr703n, в принципе подойдет любой другой с прошивкой openwrt.

Итак на роутере с прошивкой openwrt делаем следующие

1. Устанавливем драйвер для usb2com arduino UNO R3 на чипе atmega16u2

opkg update
opkg install kmod-usb-acm

2. Подключаем arduino UNO R3 в USB порт роутера. Проверяем определилась ли ардуина

ls /dev/ttyACM*

 Должно вывести строку

/dev/ttyACM0

 

 3. Устанавливаем и настраиваем пакeт stty, который устанавливает определенные характеристики терминального ввода/вывода для устройства:

opkg update
opkg install coreutils-stty

 Запускаем stty с параметрами

stty -F /dev/ttyACM0 cs8 115200 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts -hupcl

 Для того что бы stty запускался во время загрузки роутера прописываем его в автозагрузку

nano /etc/init.d/stty

вставляем текст

#!/bin/sh /etc/rc.common
START=10
STOP=15
start(){
stty -F /dev/ttyACM0 cs8 115200 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts -hupcl
}
stop(){
echo "nothing to do"
}

 Делаем скрипт исполняемым, включаем автозагрузку и стартуем его

chmod +x /etc/init.d/stty 
/etc/init.d/stty enable
/etc/init.d/stty start

 На этом настройка arduino UNO R3 в openwrt закончена.

4. Проверка работоспособности на тестовом примере.

Подключем ардуину к компьютеру и заливаем в нее тестовый скетч, который при посылке на ардуину единицы включает светодиод на плате, а при отправке нуля выключает.

int ledPin = 13;
void setup()  
{   
  Serial.begin(115200);   
  pinMode(ledPin, OUTPUT);       
}
void loop()  
{  
  if (Serial.available() > 0)  
  {  
    byte inByte = Serial.read();  
    switch (inByte)  
    {  
        case 49:  
        digitalWrite(ledPin, HIGH);  
        Serial.println("ON!");  
        break;  
        
        case 48:  
        digitalWrite(ledPin, LOW);
        Serial.println("OFF");  
        break;  
    }          
  }  
}

 Подключаем arduino к роутеру

Зажигаем светодиод

echo 1 > /dev/ttyACM0

Тушим светодид

echo 0 > /dev/ttyACM0

Читаем данные с ком порта

cat /dev/ttyACM0

 Скорее всего, что в таком виде светодиод у вас не заработает. По крайней мере у меня не заработал на моей arduino UNO R3. Что бы заработало нужно открыть второе терминальное окно и в нем запустить команду чтения с com порта.

cat /dev/ttyACM0

 В первом терминальном окне запускаем команды на зажигание и отключения светодиода.


Данная проблема описана на форумах ардуины. Для ее решения нужно отключить auto reset. Для разных версий платы ардуины она решается по разному. Для arduino UNO R3 я использовал способ подключения конденсатора 10мФ между Gnd и Reset.

После данного мода отсылать команды на ардуину можно без постоянно запущенного окна на чтение ком порта.

 

Log in to comment

: 24 март 2016 21:04 Автор: mszerg #1243
mszerg аватар
Я не претендую на оригинальность изложения. Как правило мои статьи это компиляция общедоступной информации в интернете, но с одним отличием они проверены мной лично на работоспособность и исправлены от косяков, которые почему кочуют от одного копипаста к другому.

Оставьте пожалуйста ссылку на вашу статью, я посмотрю и может оставлю ссылку, если я был настолько вопиюще неправ, т.к. статья была написана несколько лет назад и я уже не помню что от куда.
: 24 март 2016 19:32 Автор: viktor-gon #1242
viktor-gon аватар
Специально зарегистрировался чтобы высказать свое недвольство тем, что вы использовали труд человека, и даже не позаботились должным образом о том, чтобы люди смогли перейти на оригинальный сайт, от куда была украдена львиная доля "вашей" статьи.
: 17 июль 2014 13:23 Автор: mszerg #729
mszerg аватар
А если например с помощью php скрипта и библиотеки php_serial.class.php открыть порт и в цикле постоянно читать данные и записывать их в БД? И в этом же цикле читать БД и писать в порт..
Можно и так конечно, все кто дошел до уровня настройки веб-сервера на роутере так и делают :-)
: 17 июль 2014 11:56 Автор: Михаил #728
Михаил аватар
А если например с помощью php скрипта и библиотеки php_serial.class.php открыть порт и в цикле постоянно читать данные и записывать их в БД? И в этом же цикле читать БД и писать в порт..
: 16 июль 2014 21:06 Автор: mszerg #727
mszerg аватар
Надежнее все в cron записать запуск скрипта на опрос ардуины, например каждые 10секунд.
: 16 июль 2014 18:52 Автор: Михаил #726
Михаил аватар
А как можно постоянно мониторить com порт на наличие отправки данных от ардуино, что бы их потом записать в БД. И также следить за БД и отправлять команду ардуинке..