Квадрокоптер в Израиле Quadrocopter in Israel
Главная | Каталог статей | Регистрация | Вход
Суббота
18.05.2024
23:51
Приветствую Вас Гость | RSS
Главная » Статьи » Мои статьи

Часть вторая книги о Arduino
Рис. 5-3. ШИМ в действии Например, запись analogWrite(9,128) установить яркость светодиода, подключённого к выводу 9 в 50%. Почему 128? analogWrite() требует число от 0 до 255 в качестве аргумента, где 255 означает полную яркость, а 0 - выключено. Примечание: Наличие трёх каналов - просто отлично, так как вы можете купить красный, зелёный и синий светодиоды и смешивать их цвета для получения любого другого цвета по своему желанию! Давайте попробуем. Соберите схему по рис. 5-4. Заметьте, что у светодиода есть полярность: длинная ножка (анод) должна быть справа, а короткая (катод) - слева. Также большинство светодиодов имеют плоскую фаску на стороне катода, как показано на рисунке. Рис. 5-4. Светодиод, подключённый к выводу ШИМ Далее, создайте новый скетч в Arduino и используйте

пример 5-1 (его вы также можете загрузить с www.makezine.com/getstartedarduino): Пример 5-1. Плавное включение и выключение светодиода, подобное режиму сна в компьютере Apple. #define LED 9 // the pin for the LED int i = 0; // We'll use this to count up and down void setup() { pinMode(LED, OUTPUT); // tell Arduino LED is an output } void loop(){ for (i = 0; i < 255; i++) { // loop from 0 to 254 (fade in) analogWrite(LED, i); // set the LED brightness delay(10); // Wait 10ms because analogWrite // is instantaneous and we would // not see any change } for (i = 255; i > 0; i--) { // loop from 255 to 1 (fade out) analogWrite(LED, i); // set the LED brightness delay(10); // Wait 10ms } } Теперь вы повторили чудесную возможность ноутбука (может быть, это не очень экономно использовать Arduino для такой простой задачи). Давайте используем эти знания чтобы улучшить нашу лампу. Добавьте в схему кнопку (назад в главу 4) к данной плате. Попробуйте сделать это не читая текст дальше, так как я хочу чтобы вы начали думать о том факте, что любая простая схема, которую я показывал здесь, является "маленьким кирпичиком" для создания всё больших и больших проектов. Если вам потребовалось заглянуть вперёд, не расстраивайтесь, самое важное - это то что вы потратили некоторое время на обдумывание того как может выглядеть такая схема. Чтобы создать эту данную, вам надо соединить схему, которую вы только-что построили

(рис. 5-4) со схемой с кнопкой, показанной на рис. 4-6. Если хотите, можете просто собрать отдельно обе эти схемы на плате; у вас на ней достаточно места. Однако, одно из преимуществ подобной платы (см. приложение A) - это то, что в ней есть пара шин, которые проходят горизонтально поверху и понизу. Одна из них отмечана красным (плюс), а вторая - синим (минус). Эти шины используются для подвода питания и общей земли куда потребуется. В случае схемы, которую надо собрать для данного примера, у вас есть два компонента (оба - резисторы), которые надо подключить в выводу GND (земля) платы Arduino. Так как у Arduino есть два вывода GND, вы можете просто соединить эти две схемы в точности как показано на обоих рисунках, а затем взять провода, подключённые на иллюстарциях к GND, и соединить их вместе. Если вы не готовы сделать это, не расстраивайтесь: просто подключите схемы к Arduino как показано на рисунках 4-6 и 5-4. Вы увидите пример, использующий отрицательную и положительную шины в главе 6. Возвращаясь к нашему следующему примеру, если у нас есть только одна кнопка, как мы будем управлять лампой? Мы изучим ещё одно действие в технике создания: определение того, как долго была нажата кнопка. Чтобы сделать такое, нам надо изменить пример 4-5 из главы 4 чтобы добавить плавную регулировку. Идея состоит в том чтобы создать "интерфейс", в котором нажатие и отпускание кнопки приводит к включению и выключению света, а нажатие и удерживание той-же кнопки изменяет яркость. Давайте рассмотрим скетч:

Пример 5-2. Включить светодиод при нажатии кнопки, оставить включённым после её отпускания с использованием простого антидребезга. Если кнопка нажата, изменять яркость. #define LED 9 // the pin for the LED #define BUTTON 7 // input pin of the pushbutton int val = 0; // stores the state of the input pin int old_val = 0; // stores the previous value of "val" int state = 0; // 0 = LED off while 1 = LED on int brightness = 128; // Stores the brightness value unsigned long startTime = 0; // when did we begin pressing? void setup() { pinMode(LED, OUTPUT); // tell Arduino LED is an output pinMode(BUTTON, INPUT); // and BUTTON is an input } void loop() { val = digitalRead(BUTTON); // read input value and store it // yum, fresh // check if there was a transition if ((val == HIGH) && (old_val == LOW)) { state = 1 - state; // change the state from off to on // or vice-versa startTime = millis(); // millis() is the Arduino clock // it returns how many milliseconds // have passed since the board has // been reset. // (this line remembers when the button // was last pressed) delay(10); } // check whether the button is being held down if ((val == HIGH) && (old_val == HIGH)) { // If the button is held for more than 500ms. if (state == 1 && (millis() - startTime) > 500) { brightness++; // increment brightness by 1 delay(10); // delay to avoid brightness going // up too fast if (brightness > 255) { // 255 is the max brightness brightness = 0; // if we go over 255 // let's go back to 0 } } } old_val = val; // val is now old, let's store it if (state == 1) { analogWrite(LED, brightness); // turn LED ON at the // current brightness level } else { analogWrite(LED, 0); // turn LED OFF } } Попробуйте скетч.

Как видно, наша модель наша модель взаимодействия обретает форму. Если вы нажмёте и немедленно отпустите кнопку, вы включите или выключите лампу. Если держать кнопку нажатой, яркость светодиода будет изменяться. Просто отпустите кнопку, когда установите желаемую яркость. А теперь давайте разберёмся как использовать более интересные сенсоры. 5.3 Использование фотодатчика вместо кнопки Сейчас мы произведём интересный эксперимент. Возьмём фотодатчик, как на рис. 5-5. В темноте сопротивление светочувствительного датчика весьма высокое. Если на него посветить, сопротивление быстро снижается и становится достаточным для прохождения электричества. Таким образом, у нас есть выключатель, активируемый светом. Соберите схему для примера 4-2 (см. "Использование кнопки для управления светодиодом" в главе 4), затем загрузите код из примера 4-2 в вашу Arduino. Теперь подключите фотодатчик в плату вместо кнопки. Вы увидите, что если закрыть датчик рукой, светодиод выключится. Откройте датчик, и светодиод зажжётся. Вы только-что собрали свой первый светодиод, управляемый датчиком. Это важно, так как первый раз в книге мы используем электронный компонет, не являющийся просто механическим устройством: это полнофункциональный датчик.

5.4 Аналоговый ввод Как вы узнали из предыдущего раздела, Arduino может определять, было-ли приложено напряжение к одному из её выводов и сообщать это функции digitalRead(). Тип ответа "да/нет" хорош для многих приложений, но датчик света, который мы недавно использовали, может сообщить нам не только что свет есть, но также и сколько его. В этом и состоит разница между датчиками вк/выкл (который сообщает что что-то мы что-то имеем) и аналоговым датчиком, данные которого постоянно изменяются. Для чтения таких датчиком нам требуется другой тип выводов. В правой нижней части платы Arduino вы видите шесть выводов, обозначенных "Analog In"; это специальные выводы, которые могут сообщить нам не только что к ним приложено напряжение, но и его величину. Используя функцию analogRead(), мы можем считывать это напряжение. Данная функция возвращает числа от 0 до 1023, которые соответствует напряжениям в пределах от 0 до 5 вольт. Например, для напряжения величиной 2,5 В, приложенного к выводу 0, функция analogRead(0) вернёт 512. Теперь, если вы соберёте схему по рис. 5-6, используя резистор 10 кОм и запустите код из примера 5-3, вы увидите что светодиод на плате (также вы можете вставить светодиод в выводы 13 и GND как показано в разделе "Мигающий светодиод" из главы 4) мигает с частотой, зависящей от освещённости фотодатчика. Рис. 5-6. Схема с аналоговым датчиком Пример 5-6. Мигание светодиодом со скоростью, зависящей от величины на аналоговом входе #define LED 13 // the pin for the LED int val = 0; // variable used to store the value // coming from the sensor void setup() { pinMode(LED, OUTPUT); // LED is as an OUTPUT // Note: Analogue pins are // automatically set as inputs } void loop() { val = analogRead(0); // read the value from // the sensor digitalWrite(13, HIGH); // turn the LED on delay(val); // stop the program for // some time digitalWrite(13, LOW); // turn the LED off delay(val); // stop the program for // some time } Теперь попробуйте пример 5-4, но перед этим вам придётся изменить свою схему.

Посмотрите на рис. 5-4 ещё раз и соедините светодиод с выводом 9. Так как у вас уже есть собранная схема, вам надо найти точку платы где светодиод, провод и резистор не будет соединён с фотодатчиком. Пример 5-4. Установка яркости светодиода, определяемая данными на аналоговом входе. #define LED 9 // the pin for the LED int val = 0; // variable used to store the value // coming from the sensor void setup() { pinMode(LED, OUTPUT); // LED is as an OUTPUT // Note: Analogue pins are // automatically set as inputs } void loop() { val = analogRead(0); // read the value from // the sensor analogWrite(LED, val/4); // turn the LED on at // the brightness set // by the sensor delay(10); // stop the program for // some time } Примечание: мы указываем яркость, деля val на 4 из-за того, что analogRead() возвращает число до 1023, а analogWrite() принимает 255 максимум. 5.5 Попробуйте другие аналоговые датчики Используя ту-же схему что вы видели в предыдущем разделе, вы можете подсоединить множество других резистивных датчиков, которые работают более-менее подобным образом. Например, вы можете подключить термистор (простое устройство, изменяющее своё сопротивление в зависимости от температуры). В схеме показано как изменение сопротивления изменяет напряжение в ней. Это напряжение может быть измерено Arduino. Если вы работаете с термистором, будьте внимательны с правильным соотношением данных, которые вы прочитали и действительно измеренной температурой. Если вам надо точные значения, вам потребуется записать числа, считываемые с аналогового входа и сравнить их с настоящим термометром. После этого можно составить табличку и выработать способ калибровки аналоговых результатов и фактической температуры окружающей среды. До сих пор мы использовали в качестве устройства вывода светодиод, но сейчас как нам прочесть действительные данные значений, полученный Arduino с датчика?

Мы не можем сделать плату, мигающую кодом Морзе (ну, вообще-то можем, но для людей есть более простые способы чтения данных). Для этого мы может заставить Arduino общаться с компьютером по последовательному порту, который и будет описан в следующем разделе. 5.6 Последовательная связь Как вы прочли в начале книги, у Arduino есть USB-подключение, используемое средой разработки для загрузки кода в процессор. Хорошая новость в том, что это подключение также может использоваться скетчами для отправки назад на компьютер данных или получения команд от него. Для этой цели мы изучим обьект serial (обьект - это набор свойств, которые обьединены вместе для удобства пишущих скетчи людей). Этот обьект содержит весь код, необходимый для отправки и получения данных. Сейчас мы используем предыдущую схему с фоторезистором и будем отправлять значения, которые прочли, на компьютер. Вставьте следующий код в новый скетч (его также можно скачать с www.makezine.com/getstartedarduino): Пример 5-5. Отправка на компьютер данных, прочитанных с аналогового входа 0.

После выгрузки скетча на плату нажмите кнопку "Serial Monitor" в IDE. #define SENSOR 0 // select the input pin for the // sensor resistor int val = 0; // variable to store the value coming // from the sensor void setup() { Serial.begin(9600); // open the serial port to send // data back to the computer at // 9600 bits per second } void loop() { val = analogRead(SENSOR); // read the value from // the sensor Serial.println(val); // print the value to // the serial port delay(100); // wait 100ms between // each send } После того, как вы выгрузите скетч в Arduino, нажмите кнопку "Serial Monitor" в Arduino IDE (самая правая в панели кнопок); в открывшемся вы увидите постоянно увеличивающийся список цифр. Теперь любая программа, способная работать с последовательным портом, может вести диалог с Arduino. Существует много языков программирования, которые позволяют писать программы, общающиеся с последовательным портом. Processing (http://www.processing.org/) является отличным дополнением к Arduino из-за того что и язык, и IDE очень похожи. 5.7 Управление большими нагрузками (электродвигатели, лампы и тому подобное) Каждый из выводов Arduino может быть использован для запитки устройств с током до 20 миллиампер - это очень маленькая величина тока, достаточная только для питания светодиода. Если вы попробуете управлять чем-нибудь другим, например, моторчиком, вывод немедленно перестанет работать, и, вероятно, сожжёт весь процессор. Для управления большими нагрузками, такими как электродвигатели или лампы накаливания нам требуется внешний компонент, который может включать и выключать другие компоненты и который управляется выводом Arduino. Одним из таких приборов является MOSFET-транзистор (МОП-транзистор) - не обращайте внимания на смешное название - это электронный выключатель, который может управляться приложением напряжения на один из его трёх выводов, каждый из которых называется затвором. Он подобен выключателю света в доме, когда движение руки для включения или выключения света заменено выводом Arduino, подабщим напряжение на затвор такого транзистора. Примечание: MOSFET означает "metal–oxide–semiconductor field-effect transistor" (металл-оксид-полупроводник (МОП) полевой транзистор).

Это специальный вид транзистора, который может работать на принципе полевого эффекта. Это означает, что электричество будет протекать через частицу полупроводника (между выводами стока и истока) при прикладывании напряжения к выводу затвора. Так как затвор изолирован от остальных выводов плёнкой оксида металла, из Arduino в MOSFET ток не протекает, что позволяет создать простой интерфейс. Они идеальны для включения и выключения больших нагрузок с высокой частостой. На рис. 5-7 видно как мы применили MOSFET IRF520 для включения и выключения маленького моторчика, присоединённого к вентилятору. Вы также должны заметить, что моторчик получает питание от разъёма 9 В на плате Arduino. Это ещё одно преимущество MOSFET: он позволяет управляет приборами, у которых питание осуществляется от других источников. Так как MOSFET подключён к выводу 9, мы может использовать команду analogWrite() для управления скоростью моторчика при помощи ШИМ. 5.8 Сложные сенсоры Мы определим сложные сенсоры как такие, которые могут выдавать информацию, что требует больше чем просто функции digitalRead() или analogRead(). Обычно они представляют собой маленькую схему с небольшим микроконтроллером внутри, который предварительно обрабатывает информацию. Некоторые из таких сложных сенсоров являются ульразвуковыми или инфракрасными датчиками расстояния, акселерометрами.

Вы можете увидеть примеры на нашем сайте в разделе "Tutorials" (www.arduino.cc/en/Tutorial/HomePage). Книга "Making Things Talk" (автор - Tom Igoe, издательство O'Reilly) подробно разъясняет принципы этих сенсоры, а также множество других. Рис. 5-7. Схема двигателя вентилятора с Arduino Глава 6. Разговоры с облаками В предыдущих главах вы познакомились с основами Arduino и основнами строительных блоков. Позвольте мне напомнить вам, из чего состоит "алфавит Arduino": 6.1 Цифровой вывод 6.1.1 Цифровой вывод Мы использовали его для управления светодиодом, но, с правильной схемой он может использоваться для управления моторами, создания звуков и многого другого.

6.1.2 Аналоговый вывод Даёт возможность управлять яркостью светодиода, а не просто включать или выключаеть его. Мы даже можем контролировать с его помощью скорость электродвигателя. 6.1.3 Цифровой ввод Позволяет нам читать состояние простых сенсоров, таких как кнопки или датчики наклона. 6.1.4 Аналоговый ввод Мы можем читать сигналы с датчиков, которые постоянно посылают данные, а не просто "вкл/выкл", таких как потенциометр или датчик света. 6.1.5 Последовательная связь Позволяет связываться с компьютером и обмениваться данными, или просто следить за тем, что происходит в скетче, выполняющемся Arduino. В этой главе мы посмотрим как обьединить работающие приложения используя всё что мы выучили в предыдущих. Эта глава покажет вам как каждый отдельный пример может быть использован как кирпичик при построении сложного проекта. Вот где во мне проявляется желание быть дизайнером. Мы создадим версию двадцать первого века классической лампы моего любимого итальянского дизайнера, Джо Коломбо. Обьект, который мы будем создавать, называется "Атон" с 1964 года.

Рис. 6-1. Закончення лампа Лампа, которую вы можете видеть на рис. 6-1 - это простой шар, установленный на подставке с большим отверстием для того чтобы шар не скатился с вашего стола. Такая конструкция позволяет направлять лампу куда угодно. В терминах функциональности, мы хотим создать устройство, которое должно подключаться к интернету, получать текущий список статей в блоге Make blog (blog.makezine.com) и подсчитывать использованное количество слов "peace", "love" и "Arduino". С этими значениями мы будет создавать цвет и показыавть его при помощи лампы. Лампа имеет кнопку для включения и выключения, а также датчик света для автоматического включения. 6.2 Планирование Давайте посмотрим чего мы хотим добиться и что нам для этого надо. Во-первых, нам требуется чтобы Arduino могла подключаться к интернету. Поскольку у платы Arduino есть только USB-порт, мы не можем подключить её к интернету напряму, так-что нам надо подумать как соединить их. Обычно люди запускают приложение на компьютерах, которые подключаются к интернету, обрабатывают данные и посылают Arduino пакеты обработанной информации. Arduino - это простой компьютер с небольшой памятью, она не может легко обрабатывать большие файлы, и мы подключимся к RSS-ленте для получения понятного XML-файла, который требует больше оперативной памяти. Мы создадим промежуточный элемент (прокси) для упрощения XML с применением языка Processing. Processing Processing - это то, откуда появился Arduino. Мы любим этот язык и используем его как для обучения программирования начинающих, так и для создания прекрасного кода. Другое преимущество Processing - это то, что у него открытый код и он работает на всех основных платформах (Mac, Linux и Windows).
Он также может создавать отдельные приложения, которые будут выполняться на этих платформах. Более того, сообщество Processing довольно оживлено и полезно, к тому-же вы можете найти тысячи уже написанных примеров программ. Прокси сделает для нас следующая работу: скачает ленту RSS с сайта makezine.com и извлечёт все слова из полученного XML-файла.Затем, пройдя по файлу, он подсчитает количество слов "peace", "love" и "Arduino" в тексте. Исходя из полученных трёх чисел мы можем вычислить значение цвета, которое пошлём Arduino. Плата отправит обратно величину света, измеренную датчиком и покажет её на экране компьютера. Со стороны аппаратного обеспечения, мы обьединим пример с кнопкой, управлением светодиодом при помощи ШИМ (умноженное на три) и последовательную связь.

Поскольку Arduino - простое устройство, нам требуется закодировать цвет простым способом. Мы будем использовать стандартный способ, представленный в языке HTML: знак решётки # с шестью шестнадцатеричными цифрами после него. Шестнадцатеричные цифры удобны потому, что каждое 8-битовое число сохраняется в двух битах; для десятичных чисел количество знаков меняется от одного до трёх. Предсказуемость делает код проще: ждём, пока не увидим решётку "#", затем считываем шесть знаков после неё в буфер (переменную для временного хранения данных). И, наконец, превращаем каждую группу из двух цифр в один байт, который будет соответствовать яркости одного из трёх светодиодов. 6.3 Программирование Вы будете запускать два скетча: один скетч на языке Processing и один а языке Arduino. Вот код для Processing. Вы можете скачать его с www.makezine.com/getstartedarduino. Пример 6-1. Честь кода для лампы с подключением к сети, вдохновлённые записью блоге Tod E. Kurt (todbot.com) import processing.serial.*;

String feed = "http://blog.makezine.com/index.xml"; int interval = 10; // retrieve feed every 60 seconds; int lastTime; // the last time we fetched the content int love = 0; int peace = 0; int arduino = 0; int light = 0; // light level measured by the lamp Serial port; color c; String cs; String buffer = ""; // Accumulates characters coming from Arduino PFont font; void setup() { size(640,480); frameRate(10); // we don't need fast updates font = loadFont("HelveticaNeue-Bold-32.vlw"); fill(255); textFont(font, 32); // IMPORTANT NOTE: // The first serial port retrieved by Serial.list() // should be your Arduino. If not, uncomment the next // line by deleting the // before it, and re-run the // sketch to see a list of serial ports. Then, change // the 0 in between [ and ] to the number of the port // that your Arduino is connected to. //println(Serial.list()); String arduinoPort = Serial.list()[0]; port = new Serial(this, arduinoPort, 9600); // connect to Arduino lastTime = 0; fetchData(); } void draw() { background( c ); int n = (interval - ((millis()-lastTime)/1000)); // Build a colour based on the 3 values c = color(peace, love, arduino); cs = "#" + hex(c,6); // Prepare a string to be sent to Arduino text("Arduino Networked Lamp", 10,40); text("Reading feed:", 10, 100); text(feed, 10, 140); text("Next update in "+ n + " seconds",10,450); text("peace" ,10,200); text(" " + peace, 130, 200); rect(200,172, peace, 28); text("love ",10,240); text(" " + love, 130, 240); rect(200,212, love, 28); text("arduino ",10,280); text(" " + arduino, 130, 280); rect(200,252, arduino, 28); // write the colour string to the screen text("sending", 10, 340); text(cs, 200,340); text("light level", 10, 380); rect(200, 352,light/10.23,28); // this turns 1023 into 100 if (n <= 0) { fetchData(); lastTime = millis(); } port.write(cs); // send data to Arduino if (port.available() > 0) { // check if there is data waiting int inByte = port.read(); // read one byte if (inByte != 10) { // if byte is not newline buffer = buffer + char(inByte); // just add it to the buffer } else { // newline reached, let's process the data if (buffer.length() > 1) { // make sure there is enough data // chop off the last character, it's a carriage return // (a carriage return is the character at the end of a // line of text) buffer = buffer.substring(0,buffer.length() -1); // turn the buffer from string into an integer number light = int(buffer); // clean the buffer for the next read cycle buffer = ""; // We're likely falling behind in taking readings // from Arduino. So let's clear the backlog of // incoming sensor readings so the next reading is // up-to-date. port.clear(); } } } } void fetchData() { // we use these strings to parse the feed String data; String chunk; // zero the counters love = 0; peace = 0; arduino = 0; try { URL url = new URL(feed); // An object to represent the URL // prepare a connection URLConnection conn = url.openConnection(); conn.connect(); // now connect to the Website // this is a bit of virtual plumbing as we connect // the data coming from the connection to a buffered // reader that reads the data one line at a time. BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); // read each line from the feed while ((data = in.readLine()) != null) { StringTokenizer st = new StringTokenizer(data,"\"<>,.()[] ");// break it down while (st.hasMoreTokens()) { // each chunk of data is made lowercase chunk= st.nextToken().toLowerCase() ; if (chunk.indexOf("love") >= 0 ) // found "love"? love++; // increment love by 1 if (chunk.indexOf("peace") >= 0) // found "peace"? peace++; // increment peace by 1 if (chunk.indexOf("arduino") >= 0) // found "arduino"? arduino++; // increment arduino by 1 } } // Set 64 to be the maximum number of references we care about. if (peace > 64) peace = 64; if (love > 64) love = 64; if (arduino > 64) arduino = 64; peace = peace * 4; // multiply by 4 so that the max is 255, love = love * 4; // which comes in handy when building a arduino = arduino * 4; // colour that is made of 4 bytes (ARGB) } catch (Exception ex) { // If there was an error, stop the sketch ex.printStackTrace(); System.out.println("ERROR: "+ex.getMessage()); } } Есть две вещи, которые вам потребуются для правильного запуска скетча Processing. Во-первых, вы должны указать Processing создать шрифт, который мы будем использовать для скетча. Чтобы сделать это, создайте и сохраните этот скетч. Затем, при открытом скетче, щёлкните меню "Tools" и выберите "Create Font".

Выберите шрифт с именем "HelveticaNeue-Bold", выберите 32 для размера шрифта, а затем щёлкните "ОК". Во-вторых, вам требуется удостовериться в том, что скетч использует правильный последовательный порт для связи с Arduino. Вам надо подождать, пока мы не соберём схему с Arduino и загрузим в неё скетч. На большинстве систем скетч Processing будет работать нормально. Однако если вы видите что на плате Arduino ничего не происходит и на экран не выводится никаких данных от датчика света, найдите комментарий "IMPORTANT NOTE (ВАЖНОЕ ЗАМЕЧАНИЕ)" в скетче Processing и следуйте следующим инструкциям. // IMPORTANT NOTE: // The first serial port retrieved by Serial.list() // should be your Arduino. If not, uncomment the next // line by deleting the // before it, and re-run the // sketch to see a list of serial ports. Then, change // the 0 in between [ and ] to the number of the port // that your Arduino is connected to. // ВАЖНОЕ ЗАМЕЧАНИЕ // Первый последовательный порт, полученный функцией Serial.list(), // должен быть подключён к Arduino. Если это не так, раскомментируйте следующую // строку удалением // перед ней, и перезапустите // скетч чтобы увидеть список последовательных портов. Затем измените // 0 в между скобками [ и ] на номер порта, к которому // подключена ваша Arduino. //println(Serial.list()); Вот скетч для Arduino (также доступен на www.makezine.com/getstartedarduino):

Пример 6-2. Сетевая лампа с Arduino #define SENSOR 0 #define R_LED 9 #define G_LED 10 #define B_LED 11 #define BUTTON 12 int val = 0; // variable to store the value coming from the sensor int btn = LOW; int old_btn = LOW; int state = 0; char buffer[7] ; int pointer = 0; byte inByte = 0; byte r = 0; byte g = 0; byte b = 0; void setup() { Serial.begin(9600); // open the serial port pinMode(BUTTON, INPUT); } void loop() { val = analogRead(SENSOR); // read the value from the sensor Serial.println(val); // print the value to // the serial port if (Serial.available() >0) { // read the incoming byte: inByte = Serial.read(); // If the marker's found, next 6 characters are the colour if (inByte == '#') { while (pointer < 6) { // accumulate 6 chars buffer[pointer] = Serial.read(); // store in the buffer pointer++; // move the pointer forward by 1 } // now we have the 3 numbers stored as hex numbers // we need to decode them into 3 bytes r, g and b r = hex2dec(buffer[1]) + hex2dec(buffer[0]) * 16; g = hex2dec(buffer[3]) + hex2dec(buffer[2]) * 16; b = hex2dec(buffer[5]) + hex2dec(buffer[4]) * 16; pointer = 0; // reset the pointer so we can reuse the buffer } } btn = digitalRead(BUTTON); // read input value and store it // Check if there was a transition if ((btn == HIGH) && (old_btn == LOW)){ state = 1 - state; } old_btn = btn; // val is now old, let's store it if (state == 1) { // if the lamp is on analogWrite(R_LED, r); // turn the leds on analogWrite(G_LED, g); // at the colour analogWrite(B_LED, b); // sent by the computer } else { analogWrite(R_LED, 0); // otherwise turn off analogWrite(G_LED, 0); analogWrite(B_LED, 0); } delay(100); // wait 100ms between each send } int hex2dec(byte c) { // converts one HEX character into a number if (c >= '0' && c <= '9') { return c - '0'; } else if (c >= 'A' && c <= 'F') { return c - 'A' + 10; } } 6.4

Сборка схемы Рис. 6-2 показывает как собрать схему. Вам понадобится резисторы на 10 кОм (все резисторы, показанные на схеме, хотя для резисторов, подключённых к светодиодам, можно использовать меньшие значения). Вспомните пример с ШИМ из главы 5: светодиоды имеют полярность: в этой схеме длинный вывод (анод) подключается справа, а короткий (катод) - слева. (большинство светодиодов имеют фаску со стороны катода, как показано на рисунке). Рис. 6-2. Схема сетевой лампы с Arduino Соберите схему как показано на рисунке, используя один красный, один зелёный и один синий светодиоды. Затем загрузите скетчи в Arduino и Processing и запустите их. Если случились какие-то проблемы, см. главу 7. Устранение неполадок. Теперь давайте завершим устройство, поместив макетную плату в стеклянный шар. Самый простейший и дешёвый выход - купить настольную лампу "FADO" в магазине IKEA. Сейчас она продаётся за US$14.99/€14.99/£8.99 (ага, прекрасно быть европейцем). Вместо использования трёх отдельных светодиодов вы можете использовать один RGB-светодиод с четырьмя выводами.

Подключите его так-же как и светодиоды на рис. 6-2, с единственным отличием - вместо трёх отдельных выводов, подключённых на вывод GND платы Arduino (называемый общий катод, или земля), у вас будет только один провод на землю. 6.5 Как собрать лампу: Распакуйте лампу и удалите кабель от лампы к подставке. Вы больше не будете включать её в розетку. Укрепите Arduino на макетной плате и приклейте плату к лампе. Припаяйте длинные провода к светодиодам и приклейте их в нужном месте внутри лампы. Подключите провода от светодиода к плате (откуда вы их вытащили). Помните, что для RGB-светодиода требуется только один земляной провод. Или найдите подходящий кусок дерева с отверстием, который может быть использован как основание для лампы, или просто отрежьте у картонной коробки для лампы верх (примерно 5 см) и сделайте отверстие для неё. Проклейте внутренности картонной коробки клеевым пистолетом по всем граням чтобы придать жёсткость коробке. Поместите шар на основание и подключите USB-кабель к компьютеру. Запустите код Processing, нажмите кнопку "вкл/выкл" и следите как оживает лампа. Как упражнение попробуйте добавить код, который включит лампу в тёмной комнате. Другие возможные улучшения:

Добавить датчик наклона для включения или выключения лампы поворотом Добавить маленький датчик движения для включения лампы если кто-то есть поблизости и для выключения если никого рядом нет Создать различные режимы для ручного управления цветом или заставить лампу плавно менять все цвета. Подумайте о разных вещах, поэкспериментируйте и получите удовольствие! Глава 7. Устранение неполадок В ваших экспериментах настанет момент когда ничего не будет работать и вы должны будете разобраться в проблеме. Устранение неполадок и отладка - древние искусства, у которых есть несколько простых правил, но большинство результатов получаются посредством тяжёлой работы. Чем больше вы работаете с электроникой и Arduino, тем больше вы поймёте и получите опыт, который сделает процесс работы менее болезненным. Не обескураживайтесь проблемами, с которыми вы встретитесь - они не так страшны как выглядели вначале. Так как любой проект на основе Arduino состоит из программного и аппаратного обеспечений, то для поиска причины неприятностей будет больше одного места. В поисках проблемы вам следует следовать трём правилам: 7.1 Понимание 7.1.1 Понимание Попробуйте понять как можно больше о том как работают используемые вами части и какой вклад они вносят в готовый проект. Такой подход позволит вам использовать какой-либо способ проверить каждый компонент в отдельности.

7.1.2 Упрощение и разделение Древние римляне говорили: "divide et imper", что означает "разделяй и властвуй". Попробуйте разбить (мысленно) проект на его компоненты с использованием знаний где начинается и заканчивается ответственность каждого компонента. 7.1.3 Исключение и уверенность При исследование проверьте каждый компонент отдельно для того чтобы быть абсолютно уверенным что он работает. Вы будете постепенно наращивать понимание того какие части проекта делают свою работу, а какие являются сомнительными. Отладка (debugging) - это термин, используемый для определения такого процесса применительно к программированию. Легенды говорят, что в первый раз он был использован Грейс Хоппер в 1940-м, когда компьютеры были электромеханическими и один из них перестал работать из-за того что в механизм залезло настоящее насекомое (bug, баг). Множество из современных багов не являются физическими: они виртуальны и невидимы. Поэтому иногда они требуют длительного и утомительного процесса идентификации. 7.2 Проверка платы Что делал самый первый пример, "мигание светодиодом"? Разве это был он скучен? Давайте посмотрим что можно сделать. Перед тем как начать обвинять свой проект, вам стоит проверить несколько вещей в порядке, подобном тому как пилоты самолёта проверят все системы перед вылетом. Подключите свою Arduino к разъёму USB своего компьютера. Удостоверьтесь что компьютер включён (да, звучит глупо, но и такое случается). Если зелёный светодиод, обозначенные "PWR" светится, это означает что компьютер подаёт питание на плату.

Если светодиод светится слабо, что-то случилось с питанием: попробуйте другой кабель USB и проверьте USB-порт компьютера, а также разъём USB платы Arduino на предмет повреждений. Если это не помогло, попробуйте другой USB-порт компьютера. Если Arduino только-что была куплена, светодиод "L" начнёт мигать в немного нервной манере; это тестовая программа, загруженная продавцом для проверки платы. Если вы используете внешний источник питания и старую плату Arduino (Extreme, NG или Diecimila), удостоверьтесь что источник питания включён и перемычка "SV1" замыкает два ближних к разъёму питания контакта. Примечание: Если вы испытываете проблемы с другими скетчами и хотите проверить, работает-ли плата, откройте первый пример "мигание светодиодом" в IDE Arduino и выгрузите его в плату. Светодиод на плате должен начать мигать. Если вы прошли все описанные шаги успешно, можете быть уверены что плата Arduino работает корректно. 7.3 Проверка схемы на макетной плате Теперь подключите плату Arduino на макетной плате проводами от 5 V и GND к негативной и позитивной шинам. Если зелёный светодиод "PWR" выключился, немедленно отключите провода. Это означает что в вашей схеме есть большая ошибка и где-то произошло "короткое замыкание". Когда такое случается, ваша плата потребляет слишком большой ток и для защиты компьютера питание отключается. Примечание:

Если вы опасаетесь повредить свой компьютер, то знайте, что на многих компьютерах токовая защита достаточно хороша и срабатывает быстро. Также плата Arduino оснащена "полисвитчем" - прибором для защиты по току, который автоматически восстанавливается когда проблема будет устранена. Если вы настоящий параноик, вы всегда можете подключать Arduino через USB-хаб с отдельным питанием. В этом случае,если всё пойдёт очень плохо, помрёт только хаб, а не ваш компьютер. Если у вас случилось короткое замыкание, начните процесс "упрощения и разделения". Всё что вам надо сделать, это пройтись по каждому сенсору в проекте и подключать их поочерёдно. Первое, с чего следует начать - всегда питание (подключения 5 V и GND). Осмотрите их и удостоверьтесь что все части схемы подключены к ним правильно. Работать шаг за шагом и производить по одному изменению за раз - правило номер один при устранении неполадок. Это правило было вбито в мою молодую голову моим школьным учителем и первым работодателем, Маурицио Пирола. Каждый раз когда я отлаживал что-то и дела шли плохо (и, поверьте, это случалось часто), в моей голове всплывало его лицо со словами: "одно изменение за раз ... одно изменение за раз" и это обычно помогало. Это очень важно, так как что вы поймёте что устранило проблему (очень легко потерять след всех изменений, которые решили проблему, поэтому так важно делать их один за другим). Каждый опыт отладки будет выстраивать у вас в голове "базу знаний" неполадок и их возможных решений. И после тем как вы поймёте это, вы станете экспертом. Вы будете выглядет круто, так как новичок скажет "Оно не работает!", а вы бросите беглый взгляд и дадите ответите в несколько секунд.

7.4 Выделение проблемы
Другое важное правило - найти надёжный способ воспроизвести проблему. Если ваша схема ведёт себя странно в разные случайные моменты времени, попробуйте точно определить момент, в котором неполадка случается и что её могло вызвать. Такой процесс позволит вам подумать о возможной причине. Также очень полезно когда вам требуется пояснить кому-нибудь то, что вы делаете. Описание проблемы настолько точно, насколько это возможно, это также хороший способ найти решение. Попробуйте пояснить кому-нибудь проблему - во многих случаях решение всплывёт в голове как только вы озвучите проблему. Брайан В. Керниган и Роб Пайк в книге "Практика программирования" (изд-во Addison-Wesley, 1999), рассказали историю, в которой один университет "держал плюшевого мишку возле службы поддержки. Студенты с загадочными проблемами должны были пояснить их мишке прежде чем пообщаться с консультантом".


7.5 Проблемы с IDE
Иногда у вас могут быть проблемы с использованием интегрированной среды разработки Arduino, в частности, в Windows. Если вы получаете ошибку при двойном щелчке на иконке Arduino, или не происходит вообще ничего, попробуйте запустить двойным щелкчком файл run.bat. Это альтернативный способ запуска Arduino. Пользователи Windows могут также получить проблему если операционная система назначает COM-порту для Arduino номер COM10 или больше. Если такое произошло, обычно вы можете уговорить Windows назначить более низкий номер порта. Сначал откройте диспетчер устройств, нажав кнопку "Пуск", щёлкнув правой кнопкой на "Компьютер" (Vista) или "Мой компьютер" (XP) и выбрав "Свойства". В Windows XP щёлкните на "Оборудовани" и выберите "Диспетчер устройств". Для Vista щёлкните "Диспетчер устройств" (он расположен в списке приложений в левой части окна). Найдите последовательные устройства в списке "Порты (COM и LPT)". Найдите последовательное устройство, которое вы не используете и имеющее номер COM9 или ниже. Правой кнопкой мышки щёлкните на нём и выберите "Свойства". Затем выберите закладку "Параметры порта" и нажмите кнопку "Дополнительно...". Установите номер COM в COM10 или выше, нажмите "ОК" и ещё раз "ОК" чтобы закрыть окно "Свойства". Теперь сделайте то-же самое с последовательным портом USB, который представляет Arduino, с одним отличием - установить номер порта COM (COM9 или ниже), который вы только-что освободили. Если эти подсказки вам не помогли, или у ваша проблема не описана выше, просмотрите страничку устранения неполадок Arduino: www.arduino.cc/en/Guide/Troubleshooting. 7.6 Как получить помощь онлайн Если вы застряли, не тратьте дни на решение проблемы самостоятельно - попросите о помощи. Одна из лучших вещей у Arduino - это сообщество. Вы всегда найдёте помощь если сможете достаточно хорошо описать проблему. Возьмите за правило копировать и вставлять текст в поисковую систему и убеждаться что кто-то уже говорил об этом. Например, когда Arduino IDE выплевывает неприятное сообщение об ошибке, скопируйте и вставьте его в поиск Google и посмотрите, что получится. Сделайте то же самое с кода, с которым вы работаете или только определенным именем функции. Осмотритесь: все, что уже было изобретено раньше и оно хранится где-то на веб-страницах. Для дальнейших изысканий начните с главного сайта http://www.arduino.cc/ и посмотрите на часто задаваемые вопросы и ответы на них
(FAQ, www.arduino.cc/en/Main/FAQ), затем пройдитесь по "детской площадке" (playground, www.arduino.cc/playground), свободно редактируемой вики, где любой пользователь может поспособствовать улучшению документации. Это одна из лучших частей философии открытого кода. Люди способствуют созданию документации и примеров, которые вы можете применить к Arduino. Перед началом проекта поищите в детской площадке и вы найдёте части кода или схем, которые помогут вам начать. Если вы всё ещё не можете найти ответ, поищие на форуме (www.arduino.cc/cgi-bin/yabb2/YaBB.pl). Если он не содержит ответа, задайте в форуме вопрос. Выбирайте правильный раздел форума для своего вопроса: есть несколько разделов для проблем с программным или аппаратным обеспечанием, и даже форумы на разных языках. Пожалуйста, дайте как можно больше информации: Какую Arduino вы используете? Какую операционную системы вы использяете для запуска Arduino IDE?

Дайте описание того, что вы хотите сделать. Укажите ссылки к базам данных нестандартных компонентов, которые используются. Количество ответов зависит от того, как вы сформулируете свой вопрос. Ваши шансы увеличатся если вы будете избегать следующих вещей (эти правила одинаковы для любых форумой, не только об Arduino): Писать своё сообщение ЗАГЛАВНЫМИ БУКВАМИ. Это сильно раздражает людей и подобно хождению по улицам с татуировкой "новичок" на лбу (в онлайн-сообществах писать заглавными буквами означает "кричать") Писать одинаковые сообщения в разных разделах форума "Подталкивание" своих сообщений вопросами "Что, никто не ответил?", или, что ещё хуже, просто "вверх". Если вы не получили ответа, просмотрите своё сообщение. Понятна-ли тема? Вы хорошо описали проблему? Вы были вежливы? Всегда будьте вежливым. Сообщения вида "Хочу построить космический шаттл на Ардуино как мне это сделать". Это означает что вы хотите чтобы на вас работал кто-то ещё, что для настоящего самоделкина невесело. Лучше обьяснить что вы хотите сделать, а затем задать определённый вопрос об одной части проекта. Если вы зададите вопрос, то люди будут рады помочь, но если вы попросите их сделать всю работу (и не поделитесь деньгами), ответов не получите. Писать сообщения, подозрительно похожие на просьбы сделать вам домашнее задание. Преподаватели, такие как я, бродят по форумам и наказывают провинившихся студентов. Приложение A. Макетная плата Процесс создания рабочей схемы включает в себя много изменений до тех пор пока оно не станет нормальным; это очень быстрый, интерактивный процесс, который похож на электронный эквивалент создания зарисовок.

Конструкция развивается в ваших руках когда вы пробуете различные комбинацииц. Для достижения лучших результатов используйте систему, позволяющую изменять соединения сежду компонентами самым быстрым, наиболее практичным и наименее разрушающим способом. Такие требования полностью исключают пайку, являющуюся длительной процедурой и прикладывающей напряжение к деталям каждый раз, когда вы нагреваете и охлаждаете их. Решением данной проблемы является очень практичное устройство, называемое беспаечной макетной платой. Вы можете увидеть её на рис. A-1. Это небольша пластиковая пластина со множеством отверстий, каждое из которых содержит пружинный контакт. Вы можете вставить ножку компонента в одно из отверстий и получить электрический контакт со всеми отверстиями, расположенными в той-же вертикальной колонке отверстий. Каждое отверстие находится на расстоянии 2,54 мм от других. Поскольку у большинства компонентов ножки (ещё называемые "пинами") расположены со стандартным шагом, чипы со множеством ножек отлично устанавливаются. Не все контакты платы сделаны одинаковыми - есть небольшая разница. Верхний и нижний горизонтальные ряды (помеченные красным и синим цветом и обозначенные "+" и "-") соединены горизонтально и используются для подключения питания по всей плате, так-что когда вам требуется питания или земля, вы можете быстро получить их, проведя перемычку (короткий отрезок провода для соединения двух точек схемы). И последнее что вам следует знать в макетной плате - это то, что посередине платы есть большой разрыв, соизмеримый с самой маленькой микросхемой. Все вертикальные линии прерываются посередине, так-что когда вы установите в плату микросхему, у неё не будут замкнуты ножки по двум стронам микросхемы. Умно, да? Приложение B. Маркировка резисторов и конденсаторов

Для того чтобы использовать электронные компоненты, вы должны уметь различать их, что может быть трудной задачей для начинающего. Большинство сопротивлений, которые вы можете найти в магазинах, имеют цилиндрическую форму с двумя выводами и странную цветовую маркировку по кругу. Когда производились первые коммерческие резисторы, способа напечатать на них такие маленькие знаки ещё не было, так-что умные инженеры решили что они могут обзоначать величины полосками цветной краски. Теперь начинающие должны понять как расшифровать такие знаки. "Ключ" очень прост: вообще существует четыре полоски, и каждый цвет обозначает отдельную цифру. Одно из колец, обычно золотистого цвета, обозначает точность сопротивления. Для правильного прочтения кода держите сопротивления так чтобы золотистая полоска была справа. Затем читайте цвета и заменяйте их соответстсвующими цветами. В следующей таблице показано соответствие между цветами и их числовыми значениями: ЦветЗначение
Чёрный0
Коричневый1
Красный2
Оранжевый3
Жёлтый4
Зелёный5
Синий6
Красный7
Серый8
Белый9
Серебристый10%
Золотистый5%

Например, коричневый, чёрный, оранжевый и золотистый означают 103±5%. Просто, не так-ли? Не очень, так как здесь есть выверт: третья полоска означает количество нулей в значении. Поэтому 1 0 3 означает десятку с тремя нулями, в итоге получается результат 10000 Ом ±5%. Электронные ботаники любят сокращать эти значения в килоомы (тысячи ом) или мегаомы (миллионы ом) , так-что обычно 10000 Ом превращается в 10k тогда как 10000000 становится 10M. Пожалуйста, заметьте что инженеры любят улучшать всё подряд, и на некоторых схемах вы можете увидеть 4k7, что означает 4,7 килоОма, или 4700, что означает то-же самое. С конденсаторами немного легче: конденсатор в форме бочонка (электролитический) чаще всего имеет надпись со своим номиналом. Емкость конденсатора измеряется в фарадах (F), но большинство конденсаторов, с которыми вы встретитесь, измеряются в микрофарадах (uF). Так-что если вы увидите конденсатор с надписью 100 uF, это конденсатор с ёмкостью 100 микрофарад. Множество конденсаторов в форме диска (керамические) не имет надписей с указанием единиц и используют трёхзначный код, показывающий количество пикофарад (pF). В одном микрофараде 1000000 пикофарад. Подобно коду резисторов используйте третью цифру для определения числа нулей в значении, с одной разницей: если это цифра от 0 до 5, то она показывает число нулей; цифры 6 и 7 не используются; если-же вы видите 8, то умножайте первые две цифры на 0,01; а если видите девятку, то умножайте на 0,1. Итак, если конденсатор обозначен маркировкой "104", значит его ёмкость равна 100000 пикофарад, или 0,1 uF. Конденсатор с надписью 229 имеет ёмкость 2,2 пФ.
Категория: Мои статьи | Добавил: griory (22.11.2013)
Просмотров: 5650 | Комментарии: 15 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
Категории раздела
Мои статьи [6]
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Copyright MyCorp © 2024
    Бесплатный хостинг uCoz