GSM и GPRS модули для Arduino
GSM и GPRS модуль в проектах Ардуино позволяет подключаться к удаленным автономным устройствам через обычную сотовую связь.
Мы можем отправлять команды на устройства и принимать информацию от него с помощью SMS-команд или через интернет-подключение, открытое по GPRS.
В этой статье мы рассмотрим наиболее популярные модули для Arduino, разберемся с подключением и рассмотрим примеры программирования.
GSM GPRS в Arduino
Модули GSM GPRS
GSM модуль используется для расширения возможностей обычных плат Ардуино – отправка смс, совершение звонков, обмен данными по GPRS. Существуют различные виды модулей, наиболее часто используемые — SIM900, SIM800L, A6, A7.
Описание модуля SIM900
Модуль SIM900 используется в различных автоматизированных системах. С помощью интерфейса UART осуществляется обмен данными с другими устройствами. Модуль обеспечивает возможность совершения звонков, обмен текстовыми сообщениями. Работа модуля релизуется на компоненте SIM900, созданным фирмой SIMCom Wireless Solution.
Технические характеристики:
- Диапазон напряжений 4,8-5,2В;
- В обычном режиме ток достигает 450 мА, максимальный ток в импульсном режиме 2 А;
- Поддержка 2G;
- Мощность передачи: 1 Вт 1800 и 1900 МГц, 2 Вт 850 и 900 МГц;
- Имеются встроенные протоколы TCP и UDP;
- GPRS multi-slot class 10/8;
- Рабочая температура от -30С до 75С.
С помощью устройства можно отслеживать маршрут транспорта совместно с ГЛОНАСС или GPS устройством. Возможность отправки смс-сообщений используется в беспроводной сигнализации и различных охранных системах.
Описание модуля SIM800L
Модуль выполнен на основе компонента SIM800L и используется для отправки смс, реализации звонков и обмена данными по GPRS. В модуль устанавливается микро сим карта.
Устройство обладает встроенной антенной и разъемом, к которому можно подключать внешнюю антенну. Питание к модулю поступает от внешнего источника либо через DC-DC преобразователь.
Управление осуществляется с помощью компьютера через UART, Ардуино, Raspberry Pi или аналогичные устройства.
Технические характеристики:
- Диапазон напряжений 3,7В – 4,2В;
- Поддержка 4х диапазонной сети 900/1800/1900 МГц;
- GPRS class 12 (85.6 кБ/с);
- Максимальный ток 500 мА;
- Поддержка 2G;
- Автоматический поиск в четырех частотных диапазонах;
- Рабочая температура от –30С до 75С.
Описание модуля A6
Модуль A6 разработан фирмой AI-THINKER в 2016 году. Устройство используется для обмена смс-сообщениями и обмена данными по GPRS. Плата отличается низким потреблением энергии и малыми размерами. Устройство полностью совместимо с российскими мобильными операторами.
Технические характеристики:
- Диапазон напряжений 4,5 – 5,5В;
- Питание 5В;
- Диапазон рабочих температур от -30С до 80С;
- Максимальное потребление тока 900мА;
- GPRS Class 10;
- Поддержка протоколов PPP, TCP, UDP, MUX.
Модуль поддерживает карты формата микросим.
Описание модуля A7
A7 является новейшим модулем от фирмы AI-THINKER. По сравнению со своим предшественником A6 имеет встроенный GPS, позволяющий упрощать конструкцию устройства.
Технические характеристики:
- Диапазон рабочих напряжений 3,3В-4,6В;
- Напряжение питания 5В;
- Частоты 850/900/1800/1900 МГц;
- GPRS Class 10: Макс. 85.6 кбит;
- Подавление эха и шумов.
Устройство поддерживает микросим карты. Модуль поддерживает обмен звонками, обмен смс-сообщениями, передачу данных по GPRS, прием сигналов по GPS.
Где купить GSM модули для ардуино
Традиционно, прежде чем начать, несколько советов и полезных ссылок на продавцов Aliexpress.
Подключение GSM GPRS шилда к Arduino
В этом разделе мы рассмотрим вопросы подключения GSM — модулей к плате адуино. За основу почти во всех примерах берется Arduino Uno, но в большинстве своем примеры пойдут и для плат Mega, Nano и т.д.
Подключение модуля SIM800
Для подключения нужны плата Ардуино, модуль SIM800L, понижающий преобразователь напряжения, провода для соединения и батарея на 12В. Модуль SIM800L требует нестандартное для ардуино напряжение в 3,7В, для этого нужен понижающий преобразователь напряжения.
Распиновка модуля SIM800 приведена на рисунке.
Плату Ардуино нужно подключить к компьютеру через USB кабель. Батарею на 12 В подключить через преобразователь: -12В на землю Ардуино, от земли в преобразователь в минус, +12В в преобразователь в плюс. Выходы с модуля TX и RX нужно подключить к пинам 2 и 3 на Ардуино. Несколько модулей можно подключать к любым цифровым пинам.
Подключение модуля A6
Модуль A6 стоит дешевле, чем SIM900, и его очень просто подключать к Ардуино. Модуль питается напряжением 5В, поэтому для соединения не нужны дополнительно понижающие напряжение элементы.
Для подключения потребуются плата Ардуино (в данном случае рассмотрена Arduino UNO), GSM модуль А6, соединительные провода. Схема подключения приведена на рисунке.
Вывод RX с модуля GSM нужно подключить к TX на плате Ардуино, вывод TX подключить к пину RX на Ардуино. Земля с модуля соединяется с землей на микроконтроллере. Вывод Vcc на GSM модуле нужно соединить с PWR_KEY.
Подключение с помощью GSM-GPRS шилда
Перед подключением важно обратить внимание на напряжение питания шилда. Ток в момент звонка или отправки данных может достигать значений в 15-2 А, поэтому не стоит запитывать шилд напрямую от Ардуино.
Перед подключением к Ардуино нужно установить сим-карту на GSM-GPRS шилд. Также нужно установить джамперы TX и RX, как показано на рисунке.
Подключение производится следующим образом – первый контакт (на рисунке желтый провод) с шилда нужно соединить с TX на Ардуино. Второй контакт (зеленый провод) подключается к RX на Ардуино. Земля с шилда соединяется с землей с аруино. Питание на микроконтроллер поступает через USB кабель.
Макет соединения шилда и платы Ардуино изображен на рисунке.
Для работы потребуется установить библиотеку GPRS_Shield_Arduino.
Для проверки правильности собранной схемы нужно сделать следующее: соединить на Ардуино RESET и GND (это приведет к тому, что данные будут передаваться напрямую от шилда к компьютеру), вставить сим-карту в шилд и включить питание шилда. Плату Ардуино нужно подключить к компьютеру и нажать кнопку включения. Если все соединено правильно, загорится красный светодиод и будет мигать зеленый.
Краткое описание взаимодействия через AT-команды
AT-команды – это набор специальных команд для модема, состоящий из коротких текстовых строк. Чтобы модем распознал поданную ему команду, строки должны начинаться с букв at. Строка будет восприниматься, когда модем находится в командном режиме.
AT-команды можно отправлять как при помощи коммуникационного программного обеспечения, так и вручную с клавиатуры.
Практические все команды можно разделить на 3 режима – тестовый, в котором модуль отвечает, поддерживает ли команду; чтение – выдача текущих параметров команды; запись – произойдет записывание новых значений.
Список наиболее используемых AT-команд:
- AT – для проверки правильности подключения модуля. Если все исправно, возвращается OK.
- A/ — повтор предыдущей команды.
- AT+IPR? – получение информации о скорости порта. Ответом будет +IPR: 0 OK (0 в данном случае – автоматически).
- AT+ICF? – настройка передачи. В ответ придет +ICF: бит, четность.
- AT+IFC? – контроль передачи. Ответом будет +IFC: терминал от модуля, модуль от терминала (0 – отсутствует контроль, 1 – программный контроль, 2 – аппаратный).
- AT+GCAP – показывает возможности модуля. Пример ответа — +GCAP:+FCLASS,+CGSM.
- AT+GSN – получение IMEI модуля. Пример ответа 01322600XXXXXXX.
- AT+COPS? – показывает доступные операторы.
Источник: https://ArduinoMaster.ru/datchiki-arduino/gsm-gprs-modul-arduino/
Управление Arduino через интернет
ПодробностиКатегория: ArduinoОпубликовано 10.11.2015 16:35Автор: AdminПросмотров: 7300
В этой статье описан процесс “общения” с Arduino через интернет.
Команды посылаются при помощи ajax запросов, данные запросы принемает python скрипт которые передает их через последовательное соединение serial port в плату arduino.
Конечно можно приобрести готовую плату Ethernet для arduino подключить кабель и залить готовую программу. Но можно сделать все по другому.
И для этого нам понадобится:
http сервер;
интерпритатор python.
Код управления на Java Script//Порт к которому подключен Arduino var serialPort = 'COM5'; //непосредственно управляющая функция var Arduino = function(command, callback){ $.get('c.py',{ c:command, p:serialPort }, callback); }
В этом коде единственное нужно поменять имя порта, поставить то на которм у вас сидит arduino. Узнать где у вас Arduino можно посмотев в диспетчере устройств windows. Это имя скриптом передается интрепритатору phyton который подключается к arduino.
К примеру елси мы вызвали нашу функций Aruduino() с параметрами “123” то создастся запрос вида “index.html?с=123&p=COM5” который примент python скрипт. Что он из себя представляет.#!/Python33/python.exe import serial import cgi print (“STATUS: 200 OK
“) req = cgi.FieldStorage(); ser = serial.Serial(req['p'].
value, 9600, timeout=1) ser.write(bytes(req['c'].value,'latin')) ser.close() print (“ok”) По сути он просто принемает параметр “с”, и передает его в serial port “p” и далее выводит “ок” Код под Arduino #include Servo myservo; void setup() { Serial.begin(9600); } String getParam(){ String re; while (Serial.
available()) { re.concat(Serial.read()-48); } return re; } int getPin(String p){ return p.substring(0,2).toInt(); } int getVal(String p){ return p.substring(2,6).toInt(); } // Главный цикл void loop() { while (Serial.available()) { char command = (char)Serial.
read(); String param = getParam(); int pin = getPin(param); int p; switch (command) { case '0': //Digital write pinMode(pin,OUTPUT); digitalWrite(pin, LOW); break; case '1': //Digital write pinMode(pin,OUTPUT); digitalWrite(pin, HIGH); break; case '2': //Servo myservo.attach(pin); p = getVal(param); myservo.
write(p); break; case '3': //Digital read pinMode(pin,INPUT); Serial.print(digitalRead(pin)); break; case '4': { //Analog read int aPin = A0; switch (pin) { case 1: aPin = A1; break; case 2: aPin = A2; break; case 3: aPin = A3; break; case 4: aPin = A4; break; case 5: aPin = A5; break; } Serial.
print(analogRead(aPin)); } break; case '5': //Analog write pinMode(pin,OUTPUT); p = getVal(param); analogWrite(pin, p); break; } } }
Через последовательное соединение мы будет передовать данные следующего 1234567 где:
{1} номер команды;
{23} – номер пина;
{4567} – данные пина(если нужны);
К примеру:
- комманда 112-выставит на 12 -м пине значение HIGH;
- комманда 012-выставит на 12 -м пине значение LOW;
- комманда 208100-установит 8 пин как сервопривои и передаст значение 100 (ШИМ модуляция);
- комманда 310 – установит 10-й пин на ввод и считает с него данные 1 или 0.
Код прогаммы можно дописывать самому.
Таки образом,используя интерпритатор и ajax можно обмениваться данными с arduino главное чтобы был интернет, причем все равно какой интренет wifi, проводной или мобильный. Для доступа в Интернет через сети мобильных провайдеров можно к примеру использовать 3G маршрутизатор.
Источник: http://www.radio-magic.ru/arduino-projects/314-upravlenie-arduino-cherez-internet
Ethernet shield w5100 управление нагрузками
Arduino WEB контроль
Датчик дыма | 0 |
Температура | 0 °C |
Влажность | 0 % |
Реле №1 Реле №2 Реле №3 Реле №4
Не забывайте, что файл необходимо сохранить в кодировке “utf-8”,
Настало время нарисовать окончательную схему нашего проекта. (Извините за пэинт, нарисуете лучше, буду рад выложить=))
Пояснение по схеме. Подключаем это все в плату Ethernet Shield W5100. Он у нас здесь вроде “ломтика сыра”, а кусочком хлеба Arduino UNO. Датчик температуры и влажности DHT-11 подключен к цифровому входу 7.
Датчик газов и дыма к аналоговому входу А0. Реле управления нагрузками (в моем случае светодиоды) подключаются к цифровым выходам 2, 3, 5, 6.
Датчики как вы понимаете можно цеплять любые.
Просто я подключил то, что было под рукой.
Осталось разобраться с прошивкой. Прошивка из предыдущих статей была совсем немного изменена. Что то по отдельности описывать не стану. Вот сразу весь код прошивки.
Код
#include #include #include #include #define DHT11_PIN 7
#define REQ_BUF_SZ 20
dht11 DHT; File webFile; char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string char req_index = 0; // index into HTTP_req buffer byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 0, 20);
EthernetServer server(80); bool pin1; bool pin2; bool pin3; bool pin4; void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
SD.begin(4); Ethernet.begin(mac, ip); server.begin(); pin1 = pin2 = pin3 = pin4 = 0;
}
void loop() { // listen for incoming clients EthernetClient client = server.available();
if (client) {
// an http request ends with a blank line boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.
read(); if (req_index < (REQ_BUF_SZ - 1)) { HTTP_req[req_index] = c; // save HTTP request character req_index++; } if (c == ' ' && currentLineIsBlank) { if (StrContains(HTTP_req, "GET / ") || StrContains(HTTP_req, "GET /index.htm")) { client.println("HTTP/1.1 200 OK"); client.
println(“Content-Type: text/html”); client.println(“Connnection: close”); client.println(); webFile = SD.open(“index.htm”); } else if (StrContains(HTTP_req, “GET /favicon.ico”)) { webFile = SD.open(“favicon.ico”); if (webFile) { client.println(“HTTP/1.1 200 OK”); client.
println(); } } else if (StrContains(HTTP_req, “GET /temp.png”)) { webFile = SD.open(“temp.png”); if (webFile) { client.println(“HTTP/1.1 200 OK”); client.println(); } } else if (StrContains(HTTP_req, “GET /humid.png”)) { webFile = SD.open(“humid.
png”); if (webFile) { client.println(“HTTP/1.1 200 OK”); client.println(); } } else if (StrContains(HTTP_req, “GET /flame.png”)) { webFile = SD.open(“flame.png”); if (webFile) { client.println(“HTTP/1.1 200 OK”); client.
println(); } } else if (StrContains(HTTP_req, “GET /my.css”)) { webFile = SD.open(“my.css”); if (webFile) { client.println(“HTTP/1.1 200 OK”); client.println(); } } else if (StrContains(HTTP_req, “ajax_flame”)) { client.println(“HTTP/1.1 200 OK”); client.
println(“Content-Type: text/html”); client.println(“Connection: keep-alive”); client.println(); int smoke_gas = 0; //пин на котором подключен MQ-2 int sensorReading = analogRead(smoke_gas); int chk; chk = DHT.read(DHT11_PIN); client.print(sensorReading); client.print(“:”); client.
print(DHT.temperature); client.print(“:”); client.print(DHT.humidity); client.print(“:”); client.print((digitalRead(2)) ? “1” : “0”); client.print(“:”); client.print((digitalRead(3)) ? “1” : “0”); client.print(“:”); client.print((digitalRead(5)) ? “1” : “0”); client.print(“:”);
client.print((digitalRead(6)) ? “1” : “0”);
} else if (StrContains(HTTP_req, “setpin?pin=1”)) { pin1 = !pin1; digitalWrite(2, pin1); client.println(“HTTP/1.1 200 OK”); client.println(“Content-Type: text/html”); client.println(“Connnection: close”); client.
println(); } else if (StrContains(HTTP_req, “setpin?pin=2”)) { pin2 = !pin2; digitalWrite(3, pin2); client.println(“HTTP/1.1 200 OK”); client.println(“Content-Type: text/html”); client.println(“Connnection: close”); client.
println(); } else if (StrContains(HTTP_req, “setpin?pin=3”)) { pin3 = !pin3; digitalWrite(5, pin3); client.println(“HTTP/1.1 200 OK”); client.println(“Content-Type: text/html”); client.println(“Connnection: close”); client.
println(); } else if (StrContains(HTTP_req, “setpin?pin=4”)) { pin4 = !pin4; digitalWrite(6, pin4); client.println(“HTTP/1.1 200 OK”); client.println(“Content-Type: text/html”); client.println(“Connnection: close”); client.
println();
}
if (webFile) { while (webFile.available()) { client.write(webFile.read()); // send web page to client } webFile.
close(); } req_index = 0; StrClear(HTTP_req, REQ_BUF_SZ); break; } if (c == '
') { // you're starting a new line currentLineIsBlank = true; } else if (c != '
') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(1); // close the connection: client.stop(); }
}
void StrClear(char *str, char length) { for (int i = 0; i < length; i++) { str[i] = 0; }
}
char StrContains(char *str, char *sfind) { char found = 0; char index = 0; char len; len = strlen(str); if (strlen(sfind) > len) { return 0; } while (index < len) { if (str[index] == sfind[found]) { found++; if (strlen(sfind) == found) { return 1; } } else { found = 0; } index++; } return 0;
}
Видео работы данного проекта.
Архив с картинками для имен датчиков. Скачать. Файлы “my.css” и “index.htm” все также загружаем в корень карты памяти. Картинки распаковываем и туда же их.
Кстати! Если вы вдруг талантливый веб-дизайнер и можете предложить другой и более правильный вариант оформления страницы, будем рады вас услышать.
З.Ы. Небольшой спойлер. Уже в процессе подготовки интереснейший проект. Он будет для тех, кто бережет свою фигуру либо просто следит за своим весом. Так что ждите, и скоро вы все сами поймете)
З.Ы.Ы. Внесли изменения и дополнения. Теперь с нашей странички можно регулировать мощность с помощью ползунка. Читать.
Список электронных компонентов
Arduino | UNO R3 | 1 | Найти |
Ethernet Shield | W5100 | 1 | Найти |
Датчик температуры и влажности | DHT-11 | 1 | Найти |
Датчик дыма и газов | MQ-2 | 1 | Найти |
Модуль реле | 4 канала | 1 | Найти |
Провода Dupont Папа-Мама | Провода Dupont Папа-Мама | 6 | Найти |
Cashback на Aliexpress |
Источник: http://TehnoPage.ru/ethernet-arduino-control
Урок 10. Контроль доступа. RFID-rc522 + Servo + Arduino
В данном уроке мы научимся делать простую систему, которая будет отпирать замок по электронному ключу (Метке).
В дальнейшем Вы можете доработать и расширить функционал. Например, добавить функцию “добавление новых ключей и удаления их из памяти”. В базовом случае рассмотрим простой пример, когда уникальный идентификатор ключа предварительно задается в коде программы.
В этом уроке нам понадобится:
Для реализации проекта нам необходимо установить библиотеки:
- RFID Library for MFRC522.
Сборка:
1) RFID-модуль RC522 подключается к arduino проводами Папа-Мама в следующей последовательности:
Более подробно о подключении Rfid модуля.
2) Теперь нужно подключить Зуммер, который будет подавать сигнал, если ключ сработал и замок открывается, а второй сигнал, когда замок закрывается.
Зуммер подключаем в следующей последовательности:
5V | VCC |
GND | GND |
pin 5 | IO |
3) В роли отпирающего механизма будет использоваться сервопривод. Сервопривод может быть выбран любой, в зависимости от требуемых вам размеров и усилий, который создает сервопривод. У сервопривода имеется 3 контакта:
5V * | Красный (Центральный) |
GND | Черный или Коричневый (Левый) |
pin 6 | Белый или Оранжевый (Правый) |
*Сервопривод рекомендуется питать от внешнего источника питания, если запитать сервопривод от ардуины, то могут возникнуть помехи и перебои в работе arduino. Организовать это можно с помощью источника питания 9V и комбинированного стабилизатора 5V ,3.3V.
Более наглядно Вы можете посмотреть, как мы подключили все модули на картинке ниже:
Теперь, если все подключено, то можно переходить к программированию.
Скетч:
#include
#include
#include // библиотека “RFID”.
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате
Servo servo;
void setup() { Serial.begin(9600); Serial.println(“Waiting for card…”); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. servo.attach(6); servo.write(0); // устанавливаем серву в закрытое сосотояние
}
void loop() { // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println("Card UID: "); Serial.println(uidDec); // Выводим UID метки в консоль. if (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданому то серва открывает. { tone(5, 200, 500); // Делаем звуковой сигнал, Открытие servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.) delay(3000); // пауза 3 сек и механизм запирается. tone(5, 500, 500); // Делаем звуковой сигнал, Закрытие } servo.write(0); // устанавливаем серву в закрытое сосотояние
}
Разберем скетч более детально:
Для того, что бы узнать UID карточки(Метки), необходимо записать данный скетч в arduino, собрать схему, изложенную выше, и открыть Консоль (Мониторинг последовательного порта). Когда вы поднесете метку к RFID, в консоли выведется номер
Полученный UID необходимо ввести в следующую строчку:
if (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданному то сервопривод открывает задвижку.
У каждой карточки данный идентификатор уникальный и не повторяется. Таком образом, когда вы поднесете карточку, идентификатор которой вы задали в программе, система откроет доступ с помощью сервопривода.
Видео:
Источник: https://lesson.iarduino.ru/page/kontrol-dostupa-rfid-rc522-servo-arduino/
Управление Arduino с компьютера
Подружить Arduino с компьютером очень просто. Данные передаются через виртуальный порт RS-232(COM).
Итак переходим к действиям. Три светодиода будут управляться с клавиатуры, нажатием клавиш влево и вправо. Зажигаем первый светодиод и нажимаем клавишу влево, горящий светодиод тухнет, а слева от него загорается.
Когда позиция горящего светодиода крайняя, нажатие в ту же сторону приведет к переходу на светодиод с противоположной стороны.
На компьютере управляющая программа будет отображать позицию горящего светодиода.
Схема со светодиодами, крайне проста. LED1-3 светодиоды подключенные к ШИМ-выводам. ШИМ потребуются для фэйд-эффекта.
R1 двухсотомный резистор. Для ограничения тока проходящего через светодиод, иначе диод можно спалить.
Небольшая программа для Arduino. (Скачиваем)
// Serial LED control // compblog.vlukyanov.com //Объявляем переменные. int pin[] = {3, 5, 6}; // Объявляем массив в котором указанны номера выводов int i = 0; // Переменная для определения текущей позиции горящего светодиода int prev_i = 0; // Переменная для запоминания предыдущего светодиода // Настраиваем Arduino void setup() { // Запускаем цикл, в котором определяем контакты 3,5,6 как выводные for (int t = 0; t < 3; t++ ) // > { pinMode(pin[t], OUTPUT); } Serial.begin(9600); // Инициализируем перередачу данных по COM-порту на скорости 9600 бод } void loop() { // Запускаем цикл без каких либо действий // Только когда данные придут на COM-порт продолжится выполнение программы дальше этой строки while (Serial.available() == 0); // Данные пришли, считываем их в переменную i i = Serial.read(); // Постепенно гасим предыдущий светодиод, понижая яркость с 255 до 0; for (int j=255; j > 0; j–) { analogWrite(pin[prev_i],j); delay(1); // Небольшая задержка } analogWrite(pin[prev_i],0); // Окончательно гасим светодиод // Пришедшее значение i используем для включения следующего светодиода for (int j=0; j < 255; j++) // > { analogWrite(pin[i],j); delay(1); } // Запоминаем значение светодиода, чтоб потом гасить его, когда появится новое значение на COM-порту prev_i = i; }
Теперь нужна программа на компьютере, которая будет посылать необходимые данные в COM-порт и отображать данные на экран. Processing хорошо подойдет.
IDE Arduino основана на processing, поэтому они очень похожи как внешне, так и по синтаксису.
Тоже довольно простая программа на Processing. (Скачиваем)
// Serial LED control // compblog.vlukyanov.com import processing.serial.*; // подключаем библиотеку для общения по COM-порту // в IDE Arduino это сделанно по умолчанию, тут надо это делать дополнительно int value = 1; // переменная которую будем отправлять в COM-порт для Arduino Serial port; // переменная обозначающая порт PFont f; // переменна для шрифта void setup() { size(500,500); // создаем окно 500 на 500 px f = createFont(“Colibri”, 15,true); // определяем шрифт для данного окна port = new Serial(this, “COM5”, 9600); // задаем параметры порта, у меня он пятый } void draw() { // создаем окно background(0, 0, 0); // черный бэкграунд для окна textFont(f,200); // создаем текст text(value-1,200,300); // выводим в центр значение переменной value } void keyPressed() { // обрабатываем нажатия клавиш // переменная value сдвинута от нулевой позиции на 2, чтоб не загонять ее в минус if (keyCode == LEFT) { // при нажатии клавиши влево value = value + 1; // увеличиваем значение value на 1 if ( value > 4 ) value=2; // если она оказывается вне пределов третьего светодиода – сбрасываем значение в 2 port.write(value-2); // и отправляем это значение в COM-порт } else if (keyCode == RIGHT) { // при нажатии клавиши вправо value = value – 1; // уменьшаем значение value на 1 if ( value < 2 ) value=4; // если она оказывается вне пределов первого светодиода - сбрасываем значение в 4 > port.write(value-2); // и отправляем это значение в COM-порт } else { } // в остальных случаях ничего не делаем }
Все относительно просто. Программа на компьютере передает цифровые значения в Com-порт, Arduino гасит текущий светодиод и зажигает светодиод с номером пришедшем через порт.
Источник: http://compblog.VLukyanov.com/?p=344
Простое управление вашим Arduino через web
Эта статья предназначена для новичков. Здесь будет описано как из web приложения при помощи ajax запросов посылать команды phyton скрипту, который будет передавать их через serial port непосредственно на наш arduino.
Вы приобрели себе Arduino, попробовали несколько примеров, поигрались со скетчами. Но вам этого мало, вы хотите управлять, управлять всем этим добром через интернет.
Самый простой способ — это приобрести шилдик с Ethernet-портом и подключить его к Arduino (или приобрести платку с уже встроенным Ethernet ). Но она и стоит дороже и в управлении надо поднатаскаться.
Для работы нам понадобятся: — HTTP сервер — интерпретатор python
— Arduino
Тут я опишу где взять первое и второе, и как их подружитьТеперь по порядку. Как HTTP сервер я использую Apache. Установить его не составит труда. Если вы совсем новичок и используете windows, то можете взять пакет Denwer с официального сайта, в его составе есть Apache.
Python (я использовал версию 3.3) можете взять так же с официального сайта и установить. Теперь нам надо подружить наш Apache и python. Самый простой способ — это запускать python как cgi. Для этого открываем файл httpd.conf в папке conf в том месте где вы поставили свой apache (если вы поставили denwer то путь будет примерно следующим: [буква виртуального диска]:usrlocalbinapache)
Ищем строчку
AddHandler cgi-script .cgi
Добавляем в конце через пробел .py и смотрим, чтоб в начале строки не было знака #. Сохраняем, перезапускам сервер.
Теперь для проверки тесной дружбы pythone и apache можно создать тестовый файлик и положить его в домашнюю папку.
#!/Python33/python.exe
print (“STATUS: 200 OKnn”)
print (“hello world“)
Обратите внимание что первой строкой мы показываем где у нас лежит интерпретатор языка. У меня, например, он лежит по адресу C:/Python33/python.exe. Думаю, разберетесь. Назовите его как хотите и зайдите на него через браузер, например, так: localhost/my_first_test_phyton_file.py. Если увидите «hello world», то все хорошо.
Код основного управляющего скрипта на JavaScript предельно прост:
//Порт к которому подключен Arduino
var serialPort = 'COM5'; //непосредственно управляющая функция
var Arduino = function(command, callback){ $.get('c.py',{ c:command, p:serialPort }, callback);
}
Единственное что тут надо менять, как вы догадались, это порт, на котором у вас подключен arduino. Его всегда можно посмотреть в windows используя Диспетчер устройств.
Мы его будем передавать в наш python скрипт чтоб тот знал на какой serial port отправлять полученные данные.
Теперь, если мы сделаем вызов нашей функции, например: Arduino(123), то скрипт создаст ajax запрос вида с.
py?c=123&p=COM5 и пошлет его на наш python скрипт c.py. Рассмотрим, что он из себя представляет:
#!/Python33/python.exe
import serial
import cgi
print (“STATUS: 200 OKn”)
req = cgi.FieldStorage();
ser = serial.Serial(req['p'].value, 9600, timeout=1)
ser.write(bytes(req['c'].value,'latin'))
ser.close()
print (“ok”)
Фактически он просто принимает значение параметра «с», передает его в serial port «p» и пишет «ok». Дешево и сердито.
Для тех, кто хочет не только отдавать, но и принимать, напишем больше кодаНемного усовершенствуем нашу клиентскую часть.
//непосредственно управляющая функция
var Arduino = function(sp, errorCallback) { this.serialPort = sp; this.errorCallback = errorCallback || function(){ console.log('Error'); } this.send = function(data, callback){ var callback = callback; var self = this; data['p'] = this.serialPort; data['s'] = Math.round(Math.random()*1000); //на всякий случай, чтобы браузер не кешировал $.ajax({ url:'c.py', data:data, success:function(data){ if($.trim(data) == 'error'){ self.errorCallback(); } else { if(typeof callback == “function”) callback(data); } } }); } //передаем this.set = function(command, callback){ this.send({ c:command, r:0 }, callback); } //передаем и ожидаем ответ this.get = function(command, callback){ this.send({ c:command, r:1 //флаг отвечающий за режим “ожидаем ответа” }, callback); } }
Теперь, поскольку мы превратили Arduino в класс, то простейший вызов будет примерно таким:
var myArduino = new Arduino('COM5'); myArduino.set(113); //зажигаем светодиод на пине 13 myArduino.get(36,function(data){console.log(data)}); //смотрим состояние пина 6. и выводим его в консоль
Ну и, конечно, надо немного изменить серверную часть:
#!/Python33/python.exe
import serial
import cgi print (“STATUS: 200 OKn”)
req = cgi.FieldStorage(); try: ser = serial.Serial(req['p'].value, 9600, timeout=1)
except: print(“error”) exit() ser.write(bytes(req['c'].value,'latin'))
if int(req['r'].value) == 1: res = ''; while not res: res = ser.readline() print(res.decode('UTF-8'))
else: print (“ok”)
ser.close()
Тут почти ничего не поменялось, кроме того, что когда сервер в запросе получает параметр r=1 то он ожидает от Arduino ответ.
И мы добавили проверку на то, смог ли наш скрипт открыть serial port. Если нет, то вернет ключевое слово «error»
Теперь давайте рассмотрим скетч для arduino, который все это принимает и обрабатывает:
#include Servo myservo; void setup() { Serial.begin(9600);
} String getParam(){ String re; while (Serial.available()) { re.concat(Serial.read()-48); } return re;
} int getPin(String p){ return p.substring(0,2).toInt();
} int getVal(String p){ return p.substring(2,6).toInt();
} // Главный цикл
void loop() { while (Serial.available()) { char command = (char)Serial.read(); String param = getParam(); int pin = getPin(param); int p; switch (command) { case '0': //Digital write pinMode(pin,OUTPUT); digitalWrite(pin, LOW); break; case '1': //Digital write pinMode(pin,OUTPUT); digitalWrite(pin, HIGH); break; case '2': //Servo myservo.attach(pin); p = getVal(param); myservo.write(p); break; case '3': //Digital read pinMode(pin,INPUT); Serial.print(digitalRead(pin)); break; case '4': { //Analog read int aPin = A0; switch (pin) { case 1: aPin = A1; break; case 2: aPin = A2; break; case 3: aPin = A3; break; case 4: aPin = A4; break; case 5: aPin = A5; break; } Serial.print(analogRead(aPin)); } break; case '5': //Analog write pinMode(pin,OUTPUT); p = getVal(param); analogWrite(pin, p); break; } }
}
По serial port мы будем передавать команды вида: 1234567 где: [1] — номер команды [23] — номер пина [4567] — данные для пина, если надо. Например: 113 — установит пин 13 на вывод и передаст по нему состояние HIGH (то-есть включит).
013 — установит пин 13 на вывод и передаст по нему состояние LOW (то-есть выключит). 209100 — установит пин 9 как управляющий сервоприводом и передаст ему значение 100 через ШИМ модуляцию. 310 — установит пин 10 на ввод и считает с него данные HIGH / LOW и вернет как 1 или 0 соответственно.
Вы запросто можете дописывать и свои команды в switch case блок.
Теперь добавим немного красоты в нашу frontend часть и получим, например, такое
Далее я добавил немного магии юзер-интерфейса. Но его я не буду описывать, все интересующиеся могут взять его из архива с проектом.
Для web-части использовал Bootstrap (исключительно из-за удобства и его «резиновости») и jQuery (для ajax). Теперь посмотрим как это работает.
Сначала надо указать на каком порту у вас устройство и сколько пинов имеет. Потом выбрать на каком пине у вас что находится, и вперед к управлению.
Из недостатков такого подхода можно отметить относительно медленную скорость обмена данных. Чтоб узнать состояние, например, кнопки надо посылать запросы, но слишком часто это делать нельзя, так как можем упереться в занятый serial port. На веб-сокетах работало бы быстрее, но это уже чуть более продвинутая тема, которую я, если захотите, освещу позже.
Проверялось все под Windows 8 х64. Наверно, есть какие-то особенности реализации всего этого под другие системы, буду рад услышать об этом в комментариях.
Теперь о том, где все это может пригодится: например можно сделать демонстрационный стенд; управлять положением камеры; подключить датчик температуры и прочие приборы и удаленно наблюдать за каким нибудь процессом и т.д.
Архив с проектом
Для запуска на iPad в полный экран я использовал бесплатную программу oneUrl
В тематические хабы не вставил только лишь из за отсутствия кармы.
Это первая моя статья. Буду рад ответить на вопросы.
Источник: http://www.pvsm.ru/python/26313
Управление servo-мотором через COM-порт Arduino
Управление будет в таком виде как: в стандартном (или стороннем) окне монитора COM-порта вводим целую цифру от нуля до 180, нажимаем Enter и серво меняет положение своего плеча на заданный угол. Скетч в Arduino IDE выглядит следующим образом:Текст программы с комментариями следующий:
#include //подключение библиотеки servo
Servo myservo; // создание объекта servo для управления мотором
// на большинстве плат Arduino можно создать 12 servo объектов
String inputString = “”; // переменная типа string для сохранения входных данных
boolean stringComplete = false; // флаг данные получены
void setup() {
myservo.attach(9); //выбираем девятый управляющий дискретный выход контроллера для управления моторчиком
//инициализация последовательного порта:
Serial.begin(9600);
// получить 200 байтов и записать в переменную inputString:
inputString.reserve(200);
myservo.write(0); //выставляем изначальное положение серво в 0 градусов
}
void loop() {
serialEvent(); //вызов нашей коммуникационной функции
// печатаем ответ в COM-порт и поворачиваем серво на заданный угол: if (stringComplete) {
Serial.println(inputString);
myservo.write(inputString.toInt()); //задание положения серво-машинке из полученной команды
// обнуляем строковую переменную: inputString = “”; stringComplete = false; }
}
void serialEvent() { while (Serial.available()) { // получить новый байт данных:
char inChar = (char)Serial.read();
// добавить новый байт к строковой переменной inputString:
inputString += inChar;
// если входной символ является новой строкой, взвести флаг // что бы основной цикл обработал принятую команду: if (inChar == '
') { stringComplete = true;
}
}
}
Подключаем серво к плате контроллера по таблице соответсвия выводов:
Arduino | Servo |
Ноль питания | Коричневый провод |
Плюс 5В | Красный провод |
Дискретный выход №9 | Оранжевый провод |
В мониторе COM-порта тоже необходимо сделать некоторые настройки для корректной работы проекта. В правом нижнем углу окна необходимо выбрать следующие значения выпадающих списков “Новая строка” (чтобы все ваши команды из командной строки заканчивались концом строки) и 9600 бод (так как мы настроили последовательную связь на скорость обмена 9600). Если всё настроено правильно, то введя цифру и нажав Enter в окне монитора COM-порта, серво повернется на соответствующий угол и контроллер вернет эту цифру назад в последовательный порт.
Источник: http://geekmatic.in.ua/com_servo_arduino