void setup()
{
Serial.begin(9600);
for (int i = 0; i < 6; i++)
{
int x = pgm_read_word(&value[i]);
Serial.println(x);
}
}
void loop()
{
}
Директива PROGMEM перед объявлением массива гарантирует, что он будет храниться только во флеш-памяти. Но прочитать значение элемента из такого массива можно только с помощью функции pgm_read_word из библиотеки avr/pgmspace:
int x = pgm_read_word(&value[i]);
Символ & перед именем массива в параметре указывает, что функции передается адрес данного элемента массива во флеш-памяти, а не его значение.
Функция pgm_read_word читает из флеш-памяти слово (2 байта). В библиотеке имеются также функции pgm_read_byte и pgm_read_dword, возвращающие 1 и 4 байта соответственно.
Использование SD-карты
Несмотря на то что сами платы Arduino не имеют слота для SD-карт, некоторые платы расширения, включая Ethernet и MP3 (рис. 6.6), имеют слоты для карт SD или microSD.
Для подключения карт SD используется интерфейс SPI (обсуждается в главе 9). К счастью, чтобы использовать карту SD с платой Arduino, не требуется писать низкоуровневый код для взаимодействия с интерфейсом SPI, так как в состав Arduino IDE входит специализированная библиотека с простым названием SD.
Рис. 6.6. Плата расширения MP3 со слотом для карты microSD
Рис. 6.7. Результат работы примера Cardinfo
Эта библиотека включает множество примеров скетчей, выполняющих разные операции с картой SD, включая поиск информации о карте SD и ее вывод в монитор последовательного порта (рис. 6.7).
Запись на карту SD выполняется очень просто, как показано в следующем фрагменте кода:
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// Если файл существует, записать в него
if(dataFile) {
dataFile.println(dataString);
dataFile.close();
// вывести также в монитор последовательного порта
Serial.println(dataString);
}
В заключение
В этой главе вы познакомились со всеми аспектами использования памяти и хранения данных в Arduino. В следующих главах мы займемся исследованием приемов программирования различных последовательных интерфейсов в Arduino, начав с шины I2C.
7. Интерфейс I2C
Интерфейсная шина I2C (произносится «и квадрат си») — стандартный способ подключения периферийных устройств к микроконтроллерам. Иногда интерфейс I2C называют двухпроводным интерфейсом (Two Wire Interface, TWI). Все платы Arduino имеют хотя бы один интерфейс I2C, к которому можно подключать широкий диапазон периферийных устройств. Некоторые из таких устройств представлены на рис. 7.1.
Все три устройства в верхнем ряду на рис. 7.1 являются модулями отображения информации, выпускаемыми компанией Adafruit. В нижнем ряду слева находится модуль УКВ-приемника TEA5767. Эти модули можно приобрести на сайте eBay или где-то в другом месте за несколько долларов. Приобретая модуль TEA5767, вы получаете полноценный приемник УКВ, который можно настроить на определенную частоту командами через интерфейс I2C. В центре находится модуль часов реального времени (Real-Time Clock, RTC), включающий микросхему обслуживания шины I2C и кварцевый резонатор, обеспечивающий высокую точность измерения времени. Установив текущие время и дату через интерфейс I2C, вы сможете в любой момент прочитать текущие время и дату через тот же интерфейс I2C. Этот модуль включает также литиевую батарейку с длительным сроком службы, обеспечивающую работу модуля даже в отсутствие электропитания от внешнего источника. Наконец, справа находится 16-канальный ШИМ/сервопривод, добавляющий к вашей плате Arduino 16 дополнительных аналоговых выходов.
Рис. 7.1. Устройства с интерфейсом I2C
Стандарт I2C определяется как стандарт шины, потому что допускает подключение множества устройств друг к другу. Например, если вы уже подключили дисплей к микроконтроллеру, к той же паре контактов на «ведущем» устройстве можно подключить целое множество «ведомых» устройств. Плата Arduino выступает в роли «ведущего» устройства, а все «ведомые» устройства имеют уникальные адреса, идентифицирующие устройства на шине.
На рис. 7.2 изображена возможная схема подключения к плате Arduino двух компонентов I2C: часов реального времени и модуля дисплея.
Через интерфейс I2C можно также соединить две платы Arduino и организовать обмен данными между ними. В этом случае одна из плат должна быть настроена как ведущее устройство, а другая — как ведомое.
Рис. 7.2. Arduino управляет двумя устройствами I2C
Аппаратная часть I2C
Электрически линии соединения интерфейса I2C могут действовать подобно цифровым выходам или входам (их также называют выводами с тремя состояниями). В третьем состоянии линии соединения не находятся ни в одном из состояний, HIGH или LOW, а имеют плавающий уровень напряжения. Кроме того, выходы являются логическими элементами с открытым коллектором, то есть они требуют использования подтягивающего сопротивления. Эти сопротивления должны иметь номинал 4,7 кОм, и только одна пара контактов на всей шине I2C должна подключаться через подтягивающее сопротивление к шине питания 3,3 В или 5 В в зависимости от уровня напряжения, на котором действует шина. Если какое-то устройство на шине имеет другое напряжение питания, для его подключения необходимо использовать преобразователь уровня напряжения. Для шины I2C можно использовать модули двунаправленного преобразования, такие как BSS138, выпускаемые компанией Adafruit (www.adafruit.com/products/757).
На разных моделях Arduino интерфейс I2C подключается к разным контактам. Например, в модели Uno используются контакты A4 и A5 — линии SDA и SCL соответственно, а в модели Leonardo используются контакты D2 и D3. (Подробнее о линиях SDA и SCL рассказывается в следующем разделе.) На обеих моделях линии SDA и SCL выводятся также на колодку, находящуюся рядом с контактом AREF (рис. 7.3).
В табл. 7.1 перечисляются наиболее распространенные модели платы Arduino и контакты, соответствующие интерфейсу I2C.
Рис. 7.3. Контакты I2C на плате Arduino Uno
Таблица 7.1. Контакты I2C в разных моделях Arduino
Модель | Контакты | Примечания |
---|---|---|
Uno | A4 (SDA) и A5 (SCL) | Контакты подписаны SCL и SDA и находятся рядом с контактом AREF. Эти линии интерфейса выводятся также на контакты A4 и A5 |
Leonardo | D2 (SDA) и D3 (SCL) | Контакты подписаны SCL и SDA и находятся рядом с |