Audio Perfection Forum

Полная версия: Arduino: для детей, взрослых и аудиоаппаратуры :)
Вы просматриваете упрощённую версию нашего контента. Просмотр полной версии с полным форматированием.
Помойму в ветке будет проще, чем в чате. Чат - это река.



Мои познания в программировании МК, низкоуровневого программирования, а так-же программирования на си - это все для меня довольно далеко.

Но.
Мне это не мешает, с переменным успехом, пользовать ардуину )) /ну не так чтоб пользовать, ну.../.

http://arduino.cc/

Что такое ардуино?
Это концепция "микроконтроллеры в массы", ориентировано на человека неподготовленного, но желающего что-то сделать. Звонок кодовый в квартиру, ночник с лэдовой RGB подсветкой, показывалку температуры часов и влажности, робота.... и прочее прочее коневодство.

В концепции имеются
- програмное обеспечение ввиде проги, которая позволяет писать код и заливать его в МК одним нажатием кнопки.
- язык программирования - си, но не стоит пугаться, нам вся его моща не нужна, а то что будем пользовать - просто и маленькое ) Множество примеров и библиотечек все сделают за нас, нам останется это скрутить вместе :)
- железо. это разнообразные платки, с /до недавних пор/ хиленьким МК, с минимальной обвязкой "лишь бы работало", и с программатором USB. Внешнее питание опционально. Работает и от USB.

Т.е. весь цикл разработки сводится к написал чтото, воткнул в USB ардуинку, нажал на пимпочку в проге - и ардуинка начала выполнять написанный код.

Ознакомиться с железом можно тут - http://arduino.cc/en/Main/Products
классические представители -
http://arduino.cc/en/Main/ArduinoBoardUno
http://arduino.cc/en/Main/ArduinoBoardMega2560
Покупать можно и на великой барахолке, там дешевле. Фильтровать по внешнему соответствию + соответствию проца. это гарантирует покупку аналога ))


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






Вот.
Так с чего начать?

Ммммм, не знаю )))

Вот тут лежит мой код, который ловит ИК сигнал, управляет РГ и показывает это на экранчике 4х20 символов.
https://www.dropbox.com/sh/14znz3kdoa5qd...4G52a?dl=0

Я на самом деле перемудрил в сий прошивке, т.к. был нацелен сделать разнофункциональное устройство, умеющее интерфейситься к разным устройствам ввода/вывода, а-ля ПГА и разного вида релюшные аттенюаторы, экранчики разного размера, разные управлялки - кнопочками, ду, и т.д...

Все это предпологалось конфигурировать блоками "IFDEF"/DEFINE, первые проверяют на задефайниность константы, вторые - дефайнят константу. эти блоки проверяются на уровне компайлера, и если не задефайнена константа - то из итогового кода исключается весь блок в IFDEF. таким образом можно писать общий код, и подключать/отключать его куски в зависимости от нужд конкретной реализации.
Например если у нас не задефайнен ЛЦД экранчик, то его не надо инициализировать и не надо на него ничего выводить.



хреновый из меня учитель ))))





ЗЫ, там у них появились платки с АРМ-кортексом, мощи в них поболее... это интересно )
Для того, чтоб скомпилить, нужно
1. скачать саму прогу, http://arduino.cc/en/Main/Software - берем Arduino 1.0.6, т.к. 1.5.7 выглядит подозрительно, особенно с надписью БЕТА :)
2. попробовал сам себе скомпилировать мою же програмку - получил какой-то левый ошибка. Вобщем 1.0.6 поставляется с глюкнутой библиотечкой IR приемника. Нужно скачать свежую библиотечку отсюда https://github.com/shirriff/Arduino-IRremote (довноад зип пимпочка справа), и папку которая в зипе положить в
C:\Program Files (x86)\Arduino\libraries
при этом удалив из C:\Program Files (x86)\Arduino\libraries папку "RobotIRremote".

тогда все компилится )

Если что-то не так, то следует выбрать тип платки ардуины, для которой оно будет компилиться. в менюшке Tools > Board.


Наверное следует мне сделать проектик простой, чтоб постепенно на страницах форума его развивать )
Да-да-да
хз, как по мне ардуино это бред)
Назар, ни тебе ни мне это практически не нужно. Мне, например, не интересно платить за "overhead" заключающийся в встроенных средствах связи с USB, дополнительных размерах платы, определённых ограничениях в железе... Но я в принципе несколько раз уже ковырял MK когда возникала необходимость. И я всегда ориентирован на задачи "реального времени", т.е. перед выбором мне всегда интересно что и за какое время эта штука может сделать. Плюс, ни для меня ни для тебя нет проблемы нарисовать схемку на базе МК, ориентированную на какую-то конкретную задачу. Хотя я тут недавно столкнулся с тем что АТМЕЛ не правильно описывал конфигурацию для работы с какими-то последовательными протоколами и пришлось перекидывать пины. И конечно, каждый раз надо просмотреть страниц так 200-500 описания, прежде чем что-то нарисовать.
А теперь представь, человек не сталкивался с этими вещами и вообще далёк от вопросов проектирования электронного железа. Но может взять паяло и перепаять несколько проводов. И никогда не работал с такими штуками. У меня, например, каждый раз перед началом этих игрищ (я занимаюсь такими делами очень редко) бродит дикая мысль-а если что-то не так, а вдруг программатор не будет программировать, а вдруг компилятор не скомпиллит что-то потому что библиотеки не те или что-то ещё не так. И т.д. и т.п. А здесь всё очень просто, USB верёвка и стандартная борда. И всё вроде как есть. Начать гораздо проще. Плюс это тот-же С с набором библиотек рассчитанных на "чайников". Что удобно. Вспомни всякие устройства типа "Basic Stamp". Почему любителям он так нравился? Потому что очень просто начать. А это значительно мощнее.
Вот именно, я, например, совершенно нифига не понимаю в МК, и как с ними работать, мои знания исчерпываются простейшей логикой, но сделать что-то хочется! :)
Сколько ж мне, взрослому уже мужику, нужно времени-денег убить, чтобы научиться с нуля тому, что в 16 вкатило бы за неделю? Правильно, столько, сколько у меня нет :)
Я последний раз програмировал еще студентом, тогда конечно ничто не ограничивало это, кодил как самолет, лета все таки)
Но вот год или два назад мне надо было заюзать МК чтоб с тойже 8804 разобратся (а это пипец еще тот), я тож посмотрел на андруино, как глянул на синтаксис понял что это еще больше запутывает, а так для АВР обычная Си шка да и всех делов, вспомнил некоторые моменты синтаксиса и всех делов, примеров вагон, народ и функции готовые выкладывает итд Написал функции програмного спи за пару дней, проверил в симуляторе итд Так что я действительно не вижу смысла в Ардуино, если б там была ИДЕ как в Хайасме для програмирования тогда да, для начинающего (и далеко не только) это был бы идеал, а так не понимаю я идеи ихней

С АРМом лучше б че придумали попроще, а то меня все стремает начать им заниматся)
А програматоры итд это да, мне както столько нервов сьел, да что тут говорить, один глючный проц тоже, фьюзы не прошивал
Итак, продолжим. Буду писать пример кода, зачем он нужен и что он делает. постепенно в него буду добавлять фичь.

Варнинг, часть, если не все, будет нагло скопипащено отовсюду )))


Пример номер ноль.

http://arduino.cc/en/Tutorial/BareMinimum
PHP код:
void setup() {
  
// put your setup code here, to run once:
}

void loop() {
  
// put your main code here, to run repeatedly: 

Отличительной чертой данного кода является его нейтральность. Оно ничего не делает, но вокруг него мы будем жить.

Что же тут написано? Это две функции, которые вызываются ардуиной. Первая (setup) вызывается в момент включения ардуины, только один раз. В нее следует ложить код инициализации вякого разного - выставлять тип ножек (вход/выход), запускать инициализацию всяких библиотечек, просчитывать что-то один раз...

Вторая (loop) - запускается в цикле, т.е. процессор постоянно в ней крутится. Тут мы будем складывать рутинную работу. А-ля считывание кнопки, если изменилась = делаем что-то. Закончили делать - цикл повторяется заново.

Синтаксис -
void loop() { }
void - тип данных, возвращаемых функцией. войд - нифиха или что-то подобное.
луп - имя функции
в скобочках круглых - можно положить параметры, что функция ожидает получить. в данном случае их нет.
между фигурными скобочками складываем наш код.

все, что находится в строчке после "//" - комменты кода, ниначто не влияют. Туда для себя можно ставить заметки. Аналогично работает комбинация из /* */
/*
много
строчный
коммент */
А, из полезностей комментов - ими можно закомментить кусок кода, который мы пока не хотим компилировать. Отключит строчку, либо целый кусок.






В чате пробегала задача работы с пультиком ) Ее мы и сделаем.
Ардуино уже поставляется с библиотечкой ИК интерфейсинга. И с кучей примеров ее применения. Возьмем самый простой, берем в меню - File>Examples>Arduino-Remote-IR-Master>IRrecvDemo

получаем следующий код:


PHP код:
#include <IRremote.h>    // <<<< Подключает файл библиотечки

int RECV_PIN 11;    // <<<< декларируем переменную типа int (integer - для циферок), и заталкиваем в нее десятичное значение 11, соответствующее номеру ноги на плате ардуинки. К ней мы подключим выход ИК приемника.

IRrecv irrecv(RECV_PIN); // декларируем обьект, который для нас будет работать с ИК приемником, типа "IRrecv", именем irrecv, и передаем ему RECV_PIN (т.е. циферку 11, т.е. ногу ардуинки с ик приемником).

decode_results results// видимо сюда будут складываться результаты принятых по ИК кодов...

void setup() // функция инициализации
{
  
Serial.begin(9600); // инициализация фичи сериал-порта. ардуинка может общаться с компьютером через сериал порт, который эмулируется средством USB... вобщем можно посылать и принимать данные с ардуинки, а также смотреть на них в проге ардуинки, нажав на пимпочку в правом верхнем углу, serial monitor.
  
  
  
irrecv.enableIRIn(); // Start the receiver // запуск библиотечки приема ИК. нужно - значит нужно ))
}

void loop() { // основной цикл
  
if (irrecv.decode(&results)) { //если функция irrecv.decode вернула положительный результат, то она положила этот результат и в results. На счет "&" не паримся, эт немножко сложней и извращенней - символизирует передачу не переменной а ее адреса, и тогда функция может в этот адрес что-то положить... неважно, главное чтоб работало.
    
Serial.println(results.valueHEX);// Serial.println печатает строку results.value в последовательный порт. Т.е. мы будем видить то, что попадает на ИК приемник. вернее уже ракодированные значения кнопок. "HEX" - не знаю, видимо форматирование результата, чтоб не печаталось в бинарном виде, а в виде 0х23BF шестнадцетиричного формата.
    
irrecv.resume(); // Receive the next value // видимо нужно для жизнедеятельности ИК-библиотечки )
  

  
delay(100); // задержка, чтоб проц не слишком активно бегал по циклу безконечному. В этот период времени проц ждет заветные 100 чего-то там, и затем продолжает свою безконечную работу.


Итог - мы, после заливки в МК данного кода, получим в Serial Monitor-е коды кнопок пульта.
Со стороны железа - потребуется какой-то (понятья не имею какой) ик-приемник (они на разные частоты делаются, возможно с разным пинаутом... но мне два раза везло с ними, по типичной схемке "как на картинке"). Картинка - тут,
http://www.righto.com/2009/08/multi-prot...brary.html
http://arcfn.com/images/ir-schematic.png
Vcc и GND берутся с гребенки на платке ардуинки, там-же находится первый попавшийся свободный вход. Желательно не трогать первые два входа/выхода, т.к. туда прикручены какие-то плюшки на плате.

Вуаля, в компьютер поступают ИК коды.
Програмка полезна, т.к. позволяет нам собрать список кодов, и их затем использовать при приеме и назначении "действий" в МК.





Пример 2.
Включение/выключение светодиода (усилителя, лампочки, вентилятора...) средством пульта.

http://arduino.cc/en/Tutorial/Blink



PHP код:
#include <IRremote.h>

int RECV_PIN 11;

IRrecv irrecv(RECV_PIN);

decode_results results;
bool isPoweredOn false// переменная, в которой будем хранить статус включенности светодиода.
void setup()
{
  
pinMode(13OUTPUT); // пин номер 13 будет у нас выходом. туда светодиод и подключим.
  
Serial.begin(9600);
  
irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (
irrecv.decode(&results)) {
    if(
results.value == 0x77E1E06F) { // если код кнопки равен 0x77E1E06F (этот код взят по результатам работы примера 1)
            
if (isPoweredOn) {//если isPoweredOn=true, т.е уже включен - 
                
isPoweredOn false;   // то выключаем в переменной
                
digitalWrite(13LOW); // выключаем физически, присваевая лог.уровень LOW на ножку 13
            
}
            else { 
// иначе
                
isPoweredOn true;    // включаем в переменной
                
digitalWrite(13HIGH);    // включаем физически
            
}
        }
    
Serial.println(results.valueHEX);
    
irrecv.resume(); // Receive the next value
  
}
  
delay(100);






Ту би континьюед :)
Я тож хочу АРМом заняцца, уже платку заказал оцтойную ))
http://www.ebay.com/itm/141392937932
За такую цену грех не купить ))) попробую на ней фифо забацать а-ля ДжКилл, хотя-бы для 16бит 44100, большего мне и не нужно...
Ну вот возьмите ее стоимость - 6$. уже готового изделия. Самому делать будет дороже и дольше )))
Так у http://leaflabs.com/ (а это их клон) какие-то трудности с IDE. Страница с IDE не открывается. В чём для них писать?
да, ошибочка с моей стороны. отписал продавцу, может отменит. Прийдется искать другие варианты :) и покупать дебаггер.