вторник, 18 декабря 2012 г.

IBoard Pro - все для автоматизации на одной плате

Плата iBoard Pro заметно отличается от своих "собратьев" обилием интерфейсов, которые находятся "на борту".


Просто перечислим, что доступно:
  1. "Сердцем" платы является микроконтроллер ATMega 2560
  2. Сетевой интерфейс реализован на чипе Wiznet W5100
  3. Часовой модуль (RTC) на микросхеме DS1307 (для правильной работы часов необходимо установить на плату резервную батарейку в соответствующий слот)
  4. 40-пиновый разъем для подключения TFT-модулей (включая те, что содержат и тачскрин).  Разъем соответствует спецификации ITDB02 (параллельный интерфейс)
  5. 8-пиновый разъем для подключения TFT-модулей ITDB02 (последовательный интерфейс)
  6. Слот для установки microSD
  7. Разъем для подключения трансивера nRF24L01+
  8. Интерфейс для модулей XBee

На плате так же размещены светодиоды для индикации режимов работы (больше всего светодиодов для индикации модуля сетевого интерфейса).

Дополнительно для удобства пользователей разведено 3 UART,  1 I2C, 1 ISP и выведено 16 разъемов для подключения периферии (каждый "разъем" содержит три вывода: Vcc, GND,  DATA. Выводы DATA разведены на пины A0-A15).

Питание платы можно осуществить двумя способами: 
  • От любого блока питания (напряжение от 7 до 20В, требуемая мощность блока питания может существенно зависеть от того, какое количество периферийных модулей подключено к IBoard Pro)
  • PoE (питание через ethernet). Обратите внимание, PoE не соответствует спецификации IEEE 802.3af. Для PoE-питания этой платы необходим специальный кабель.
На плате установлено два преобразователя питания. Входное напряжение сначала понижается и стабилизируется до уровня 5В (для питания дисплейного модуля и микросхемы RTC), дальше это напряжение понижается вторым стабилизатором до 3.3В (на этом напряжении работают все остальные компоненты платы).

Программирование платы можно осуществлять двумя способами - через ISP интерфейс или с помощью модуля типа Foca V2.1 (на базе FT232RL). В наших тестах мы будем использовать второй способ, как наиболее простой.

Для заливки скетча в IBoard Pro в среде Arduino необходимо выбрать соответствующую плату ("Arduino Megs 2560 or Mega ADK") и тот порт, который соответствует программатору.

При тесте платы мы постарались максимально охватить всю имеющуюся периферию. 

В процессе будем отмечать необходимые библиотеки и указывать строки инициализации той или иной периферии (особенно когда они отличаются от тех, которые приведены в примерах к соответствующим библиотекам).

В нашем тесте помимо самой платы iBoard Pro мы будем использовать дисплейный модуль ITDB32S (3.2 дюйма, разрешение 320х240, резистивный тачскрин, параллельное подключение, 16-битный режим), карточку памяти microSD, беспроводной трансивер nRF24L01+.



Начнем!

Примечание: по этой ссылке вы можете скачать архив, внутри которого содержатся две папки - libraries с необходимыми библиотеками (ее содержимое необходимо скопировать в папку arduino\libraries на вашем компьютере) и папка samples с примерами (может быть расположена где угодно). Все примеры в файле с архивом базируются на соответствующих примерах библиотек и содержат минимальные правки (изменены строки инициализации и т.п.).

Blink - работает стандартный пример из среды Ардуино. Разработчики заботливо распаяли светодиод (обозначен "Test"на плате). 
Файл blink в архиве (папка samples).

RTC - подключение микросхемы DS1307 осуществляется по шине I2C (другое название TWI или IIC). Для работы требуется библиотека Wire (дополнительно можно использовать библиотеку RTClib или DS1307). Обратите внимание, что для микроконтроллера Mega 2560 SDA - 20, SCL - 21 пин.
Файл rtc в архиве (папка samples).

Дисплейный модуль ITDB32S - для работы требуется библиотека UTFT. При инициализации необходимо использовать следующую строчку для инициализации:
UTFT myGLCD(ITDB32S,38,39,40,41);
Если вы используете другой тип дисплея - не забудьте поправить параметры инициализации. 
UTFT(Model, RS, WR, CS, RST); // необходимые параметры смотрите в документации на дисплейный модуль.
Файл utft в архиве (папка samples).

Тачскрин дисплейного модуля ITDB32S - необходима библиотека UTouch. Инициализация модуля:
UTouch  myTouch(6,5,48,3,2); 
Файл touch в архиве (папка samples).

Карта памяти microSD - подключена через SPI. Используется аппаратный интерфейс, CS для карты памяти подключен к 4 цифровому пину. Для работы необходима библиотека (например, SD - смотри архив).

#include <SD.h>
...
  pinMode(4, OUTPUT);
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
...

Файл sd в архиве (папка samples).

LAN модуль Wiznet W5100 - так же подключен через аппаратный SPI, CS подключен на D10. Reset модуля подключен к 47 цифровому пину. Для работы модуля требуется библиотека Ethernet).
В архиве файл network - для работы примера требуется microSD.

Модуль nRF24L01+ - подключен через SPI, но используется программная реализация этого интерфейса. Такое решение обусловлено, видимо тем, чтобы можно было обеспечить одновременную работу беспроводного и сетевого интерфейса.
Для полноценной работы требуются следующие библиотеки:
В свою очередь, эти библиотеки требуют наличие библиотеки DigitalWriteFast.
Инициализация модуля делается следующим образом:
iBoardRF24 radio(12,11,8,7,9,PE7); // для iBoard Pro
Для того, чтобы заработал пример из архива (rf24) необходимо данный скетч прописать в два микроконтроллера с подключенными RF-модулями, на одном из них необходимо закоротить А0 на землю (этот модуль будет отправлять пакеты, принимать ответ и высчитывать задержку).
В качестве второго микроконтроллера в нашем тесте мы использовали "младшую" плату iBoard.  Тестовый скетч для нее пришлось чуть-чуть подправить - строка инициализации должна быть следующая:
iBoardRF24 radio(3,8,5,6,7,2); // для iBoard
Модуль Xbee протестировать не удалось из-за отсутствия последнего.

Дополнительно в архиве с примерами есть файл complex - в этом скетче объединены несколько других тестов уже протестированных подсистем (дисплей, карта памяти, тачскрин, часы, lan).

Как мы видим, эта плата является очень привлекательным вариантом, когда требуется подключить большое количество различной переферии и обеспечить взаимодействие сразу по нескольким интерфейсам (LAN, RF). Возможность работать с графическими TFT-дисплеями с тачскрином позволит поднять уровень разрабатываемого устройства на новую высоту. Так же использование Mega 2560 позволяет (на некоторое время ;) забыть о размере скетчей и количестве доступных портов ввода-вывода.

К сожалению, не обошлось и без досадных просчетов:

  • Установленный RF-модуль заметно выступает за пределы основной платы (необходимо учитывать при выборе корпуса)
  • RF-модуль затрудняет подключение к самому первому разъему для подключения переферии (A0)
  • Дисплейный модуль перекрывает разъем для установки RF-модуля (см.фото выше)
  • Установленный дисплейный модуль может ограничивать доступ к ISP-разъему и необходимо обеспечить изоляцию разъема и платы (возможно замыкание из-за их неудачного расположения относительно друг-друга). 


Но поскольку основное назначение этой платы для быстрого прототипирования, то все вышеперечисленные недостатки не являются критичными (во многих прототипах пользователи могут даже не столкнуться с ними).

Некоторые пользователи могут посчитать недостатком отсутствие у данной платы USB-интерфейса для простого подключения к компьютеру, но такое решение, на наш взгляд - вполне оправдано.

Выводы: Плата iBoard Pro - очень привлекательный модуль (да еще и при такой стоимости!), который позволяет воплотить практически любую задумку разработчика, при этом практически не ограничивая себя выбором необходимой периферии.

Полезные ссылки:


19 комментариев:

  1. Доброго Дня!!!

    Есть несколько вопросов
    По Iboard Pro ATMega2560
    Подключил через USB программатор "Foca"
    Попробовал скетч помигать светодиодом все работает,
    Подключил датчик DS18B20 Компиляция , загрузка все OK но вот результата нет,
    Поменял 4 датчика проблему это не решило.
    Датчик подключил правильно. 1 минус 2сигнал через 4,7к -3 плюс 5 вольт без внешнего питания.

    Упёрса в датчик - месяц искал в чем проблема,

    Сегодня подключил серву из набора,
    скетч из клипа Джерими Блю урок 5
    Подключил Серву от внешнего +5в.
    Минус и с Arduino и внешние питание общий провод.
    Компиляция , загрузка все OK, результата нет,
    Серва не работает, отдельно подал напряжение 3 вольта на серву управление - серва работает.

    Подскажите может есть какие то подводные камни именно с этим устройством, пробовал все ножки аналоговых выходов, подключал Вольтметр, сигнала на выход нет.

    С паяльником дружу (занимаюсь ремонтом весового и кассового оборудования), на C++ не писал но в поисках проблемы многому научился.

    ОтветитьУдалить
  2. К какому пину подключали DS18B20? Какой скетч использовался?
    К какому пину подключили серву? Какой скетч использовался?

    ОтветитьУдалить
  3. DS18B20 на 9, 10, 11

    #include

    // настройки датчиков
    #define DS18S20_ID 0x10 // Поддерживаемые датчики
    #define DS18B20_ID 0x28 // Поддерживаемые датчики
    OneWire ds(10); // Линия 1-Wire будет на pin 10

    void setup(void)
    {
    Serial.begin(9600); // Скорость консольного порта 9600 (пригодится для отладки)
    }
    void loop(void) {
    byte scountmax = 1; //количество устройств
    byte scount;
    byte i;
    byte present = 0;
    byte data[12];
    byte addr[scountmax][8];

    Serial.print("\n Start \n");

    //почистим массив
    for( scount = 0; scount < scountmax; scount++) {
    for( i = 0; i < 8; i++) {
    addr[scount][i]=0;
    }
    }


    for( scount = 0; scount < scountmax; scount++) {
    Serial.print("Search namber ");
    Serial.print(scount, DEC);
    Serial.print("--");
    if (!ds.search(addr[scount])) {
    //ds.reset_search();
    Serial.print("Search no result");
    //return;
    }
    else {
    if (OneWire::crc8( addr[scount], 7) != addr[scount][7]) {
    Serial.print("CRC is not valid!");
    //return;
    }

    Serial.print("R=");
    for( i = 0; i < 8; i++) {
    Serial.print(addr[scount][i], HEX);
    Serial.print(" ");
    }

    if (addr[scount][0] != DS18S20_ID && addr[scount][0] != DS18B20_ID) {
    //if (addr[scount][0] != DS18B20_ID) {
    Serial.print("Device is not a DS18x20 family device.\n");
    return;
    }
    }
    Serial.print("\n");
    }
    ds.reset_search();


    for( scount = 0; scount < scountmax; scount++) {
    ds.reset();
    ds.select(addr[scount]);

    // Запускаем конвертацию
    ds.write(0x44, 2);

    // Подождем...
    delay(1000);

    present = ds.reset();
    ds.select(addr[scount]);

    // Считываем ОЗУ датчика
    ds.write(0xBE);



    Serial.print("P=");
    Serial.print(present,HEX);
    Serial.print(" ");
    // Обрабатываем 9 байт
    for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
    }

    Serial.print(" CRC=");
    Serial.print( OneWire::crc8( data, 8), HEX);
    Serial.println();


    // Высчитываем температуру :)
    int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract;
    LowByte = data[0];
    HighByte = data[1];

    TReading = (HighByte << 8) + LowByte;

    // Проверяем дубак там или нет
    SignBit = TReading & 0x8000;

    // Если на улице дубак :)
    if (SignBit) {
    TReading = (TReading ^ 0xffff) + 1;
    }

    // Умножаем на (100 * 0.0625) или 6.25
    Tc_100 = (6 * TReading) + TReading / 4;

    // Отделяем целые от дробных чисел
    Whole = Tc_100 / 100;
    Fract = Tc_100 % 100;


    Serial.print(scount,DEC);
    Serial.print(" Temperature: ");

    // Если на улице дубак напишем минус перед цифрами :)
    if (SignBit) {
    Serial.print("-");
    }
    else
    {
    Serial.print("+");
    }
    Serial.print(Whole);
    Serial.print(".");

    if (Fract < 10) {
    Serial.print("0");
    }

    Serial.print(Fract);
    // Serial.print(" ");
    // Serial.print(Tc_100);
    Serial.print("\n");
    }
    }


    *****************************************************
    Серву 9, 10, 11
    #include
    Servo myservo; // объект сервы

    int servoPin = 9;

    void setup()
    {
    myservo.attach(servoPin);
    }

    void loop()
    {
    for (int i =0; i <=180; i=i+20)
    {
    myservo.write(i);
    delay(1000);
    }
    }

    подключал разные схемы

    ОтветитьУдалить
  4. напряжение питания на EB10
    S
    V
    G
    3,4 вольта

    ОтветитьУдалить
  5. на 13 пине нет напряжения
    светодиод TEST моргает
    /*
    Blink
    Turns on an LED on for one second, then off for one second, repeatedly.

    This example code is in the public domain.
    */

    // Pin 13 has an LED connected on most Arduino boards.
    // give it a name:
    int led = 13;

    // the setup routine runs once when you press reset:
    void setup() {
    // initialize the digital pin as an output.
    pinMode(led, OUTPUT);
    }

    // the loop routine runs over and over again forever:
    void loop() {
    digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
    delay(1000); // wait for a second
    digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
    delay(1000); // wait for a second
    }
    *******************************************
    в предыдущем сообщении надо читать
    не #include
    а #include

    не #include
    а #include

    ОтветитьУдалить
  6. Смотрите внимательно даташит на эту плату (ссылка в конце статьи). Там видно (стр.5), что EB10 - это A10 по "ардуиновски".
    Соответственно, скетчи ваши работали верно, только вы неверно подключали датчики и серву.

    пин D10 (там же на странице 5) можно найти в разъеме для nRF24L01+

    ОтветитьУдалить
  7. Да Ваша правда серва заработала
    Термодатчики нет
    Сегодня прикуплю новый проверю

    ОтветитьУдалить
  8. Ustas подскажите попал вот на эту ошибку
    Что он от меня просит ???


    D:\Arduino\arduino-1.0.3\libraries\Ethernet\w5100.cpp: In member function 'void W5100Class::init()':
    D:\Arduino\arduino-1.0.3\libraries\Ethernet\w5100.cpp:28: error: 'delay' was not declared in this scope
    D:\Arduino\arduino-1.0.3\libraries\Ethernet\w5100.cpp:30: error: 'SPI' was not declared in this scope
    D:\Arduino\arduino-1.0.3\libraries\Ethernet\w5100.cpp: In static member function 'static uint8_t W5100Class::write(uint16_t, uint8_t)':
    D:\Arduino\arduino-1.0.3\libraries\Ethernet\w5100.cpp:133: error: 'SPI' was not declared in this scope
    D:\Arduino\arduino-1.0.3\libraries\Ethernet\w5100.cpp: In static member function 'static uint16_t W5100Class::write(uint16_t, const uint8_t*, uint16_t)':
    D:\Arduino\arduino-1.0.3\libraries\Ethernet\w5100.cpp:146: error: 'SPI' was not declared in this scope
    D:\Arduino\arduino-1.0.3\libraries\Ethernet\w5100.cpp: In static member function 'static uint8_t W5100Class::read(uint16_t)':
    D:\Arduino\arduino-1.0.3\libraries\Ethernet\w5100.cpp:159: error: 'SPI' was not declared in this scope
    D:\Arduino\arduino-1.0.3\libraries\Ethernet\w5100.cpp: In static member function 'static uint16_t W5100Class::read(uint16_t, uint8_t*, uint16_t)':
    D:\Arduino\arduino-1.0.3\libraries\Ethernet\w5100.cpp:172: error: 'SPI' was not declared in this scope


    Библиотеки Ваши подписал
    Слабоват я пока в С++

    скетч

    #include Dhcp.h
    #include Dns.h
    #include Ethernet.h
    #include EthernetClient.h
    #include EthernetServer.h
    #include EthernetUdp.h
    #include socket.h
    #include util.h
    #include w5100.h

    #include
    #include

    byte mac[] = { 0x00, 0x3A, 0xF1, 0x19, 0x69, 0xFC }; // MAC-адрес нашего устройства
    byte ip[] = { 192, 168, 0, 106 }; // ip-адрес устройства
    byte server[] = { 192, 168, 0, 3 }; // ip-адрес удалённого сервера измените на свой
    //byte subnet[] = { 255, 255, 255, 0 }; // the subnet:
    char temp[6];
    byte isdata=0;

    EthernetClient client; //(server, 80); // 80-порт.


    void setup()
    {
    Ethernet.begin(mac, ip); // Инициализируем Ethernet
    Serial.begin(9600); // Скорость консольного порта 9600 (пригодится для отладки)
    }

    void loop()
    {
    delay(3000); // задержка в 3 сек.
    // Соединяемся
    if (client.connect(server, 80)) {
    Serial.println("connecting...");
    //
    char buf[80];

    Serial.println(buf);
    client.println(buf); // Отправляем GET запрос
    client.println("Host: opck.info"); // Указываем, какой конкретно host на данном ip нас интересует.
    client.println();

    }
    else
    {
    Serial.println("connection failed");
    }

    while (client.available()) {
    isdata=1;
    char c = client.read(); // Читаем, что нам ответил Web-сервер
    Serial.print(c);

    }

    if (!client.connected()) {
    isdata=0;
    Serial.println();
    Serial.println("disconnecting.");
    client.stop(); // Завершаем соединение
    }
    }

    ОтветитьУдалить
  9. Как минимум не хватает

    #include SPI.h

    Откуда взяли пример?

    ОтветитьУдалить
  10. непомогло

    честно не нашел , где скопировал скетч
    искал по темам температура на WEB

    ОтветитьУдалить
  11. Ну так возьмите заведомо рабочие примеры (в конце статьи есть архив с примерами, где все ТОЧНО работает) и пробуйте с ними. Комбинируйте с тем, что у вас уже работает...

    ОтветитьУдалить
  12. Доброй ночи. Будьте любезны подскажите заказал себе данную плату, теперь думаю, на сколько я понимаю из даташита, все цифровые пины заняты под оборудование (xbee, nRF24L01+ и иже с ним). На сколько я понимаю "гребенка" на левой стороне платы, если смотреть на Ваше фото. это аналоговые входы, возле которых так же есть питание +5в и земля? Не подскажете на практике, как подключиться на цифровые пины, при условии использования тачскрина. Спасибо.

    ОтветитьУдалить
  13. на цифровые пины тут подключиться не получится - все занято. Можно использовать аналоговые пины в роли цифровых (только ШИМа на них не будет, остальное будет работать)

    ОтветитьУдалить
  14. Доброй ночи, подскажите в чем может быть проблема при использовании библиотеки tinyFAT на данной плате. Если библиотеки тачскрина и самого экрана работают отлично, то с tinyFAT "затык" полнейший. Карта не откликается на команды библиотеки посланные через окно Монитора порта, хотя при заливке тестового скетча библиотеки Сд карты, все содержимое карты видно. Подключение согласно даташит платы. Карта отформатирована в FAT16. Спасибо.

    ОтветитьУдалить
  15. А что особенного дает библиотека tinyFAT по сравнению с обычной библиотекой SD?

    Проблема скорее всего в том, что в библиотеке прописаны пины, которые не соответствуют iBoard Pro (откройте папку с библиотекой и посмотрите файлы, особенно обратите внимание на MISO, MOSI, SCK, SS - эти пины как раз используются для подключения SD-модуля).

    ОтветитьУдалить
  16. Очень бы хотелось фото с установленными nrf24l01+ и этим дисплеем. Из имеющихся тяжело оценить масштаб бедствия. Они вместе туда встают хоть как-то или не встают вообще?

    ОтветитьУдалить
  17. Доброй ночи , в экспериментах запорол проц
    микросхему заказал, прислали,
    где можно найти прошивку

    ОтветитьУдалить
  18. Добрый день. Сразу скажу что с Arduino и AVR никогда дела не имел, но есть желание попробовать и к тому же есть идея для проекта.
    Подскажите данная плата подойдёт для реализации LAN тестера с дополнительной возможностью получения IP адреса по DHCP и назначение его статически или нет?
    Или может есть другие решения, по дешевле?
    За ранее Спасибо!

    ОтветитьУдалить
  19. Здравствуйте,

    Я только начинаю изучение ардуино. С пинами на УНО более-мение понятно. Но с сабжем возникли трудности. Не могу понять с подключением. Загрузил blink скетч, диод на плате мигает. Но на ЕВ13 питание на V и G постоянно 3,25 (замерял тестером) и не пропадает. Особо пока ничего не тестил. Пробовал задействовать кнопку из второго урока Джереми, может что-то спалил?

    Как правильно использовать блок EB? Где можно почитать?

    Спасибо.

    ОтветитьУдалить