• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!

Поиск по сайту

Результаты поиска по тегам 'arduino'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип публикаций


Категории и разделы

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
  • Радиоэлектроника для профессионалов
    • Световые эффекты и LED
    • Роботы и модели на ДУ-управлении
    • Автоматика
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Автомобильная электроника
    • Системы охраны и наблюдения. Личная безопасность
    • Питание
    • Электрика
    • Промышленная электроника
    • Ремонт
    • Металлоискатели
    • Измерительная техника
    • Мастерская радиолюбителя
    • Сотовая связь
    • Спутниковое ТВ
    • КВ и УКВ радиосвязь
    • Жучки
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
    • МК для начинающих
    • AVR
    • PIC
    • STM32
    • Arduino и Raspberry Pi
    • ПЛИС
    • Другие микроконтроллеры и семейства
    • Алгоритмы
    • Программаторы и отладочные модули
    • Периферия и внешние устройства
    • Разное
  • Товары и услуги
    • Коммерческие предложения
    • Продам-Отдам, Услуги
    • Куплю
    • Уголок потребителя
    • Вакансии и разовая работа
    • Наши обзоры и тесты
  • Разное
    • Конкурсы сайта с призами
    • Сайт Паяльник и форум
    • Курилка
    • Технический английский (English)
    • Наши проекты для Android и Web
    • FAQ (Архив)
    • Личные блоги
    • Корзина
    • Вопросы с VK
  • ATX->ЛБП Переделки
  • Юмор в youtube Киловольты юмора
  • Надежность и группы продавцов Радиолюбительская доска объявлений exDIY
  • разные темы Переделки

Блоги

Нет результатов для отображения.

Нет результатов для отображения.

Местоположения

  • Пользователи форума

Группа


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Найдено 253 результата

  1. Добрый день. Собрал лазерный сигнализатор задевания сетки для игры в пинг-понг теперь хочу пойти дальше и сделать дисплей для вывода счета. Иначе приходится считать все самому, а если кто-нибудь придет и отвлечет, так счет сразу из головы вылетает. Хочу сделать все как можно проще, но при этом чтобы не было примитивно. У меня есть запысы плат Arduino Nano V3 328 16M 5V CH340G, которые я как-то по распродаже заказывал из китая, потому хочу использовать одну и приделать к ней дисплей. Пока думаю в двух направляниях. 1й - купить где-нибудь на авито сломаный планшет с целым экраном, достать дисплейный модуль и переделать его для работы с ардуиной. 2й - собрать из всетодиодов большой экран на 4 цифры, каждая цифра по 7 сегментов. Вопрос у меня по второму варианту. Подскажите пожалуйста схемы подобных дисплеев. Еще желательно чтобы упраление шло по I2C интерфейсу, чтобы кучу выводов не задйствовать, но можно и более примитивно. Спасибо.
  2. помогите, пожалуйста, решить мою проблему: имеется arduino mega2560 (китайская) после приобретения я работал только с цифровыми входами сегодня решил сделать dc вольтметр, пришлось задействовать аналоговый вход в процессе отладки выяснил, что на всех входах (проверял в цикле) постоянно значение 1023 (или 5v в зависимости от интерпретации кода) и при подаче напряжения и без тестовое напряжение никогда не превышало 5в что с платой, или что я делаю не так?
  3. Подскажите как можно сделать программку на андроид для обмена данными с контроллером? Например дергать выводами arduino со смарта по wi-fi (само собой через соответствующий шилд) Накидать кнопок ползунков... и задать им соответствие каким-то байтам в памяти контроллера. С разработкой на андроид связываться не хочется)))
  4. Добрый день уважаемые! хотелось бы вашего совета по блоку питания! Суть проблемы такова, имеется прибор на Arduino с 3 датчиками и несколькими кнопками (если быть совсем честным и точным это контроллер джойстика). У большинства народа и у меня в частности этот прибор имеет нестабильности в работе датчиков, так как собственного питания ардуины на датчики хватает с некоторым натягом и более того, склонен я думать что питание ардуины от USB имеет "некоторые" проблемы с помехами и скачками питания- отчего возникают шумы в показаниях. Решение проблемы я вижу в 3 вариантах: 1 шумы датчиков, 2 шумы контроллера, 3 шумы источника питания. Не вдаваясь, пока что, в первые две, хочу решить 3 проблему. Моя цель собрать или купить готовый блок, модуль или комплектующие и собрать сетевой(желательно безтрансформаторный-трудно добыть, еще сложней перемотать) качественный блок питания с стабилизированным DC напряжением 5 V на небольшую мощность- 200-500 mA Возможно я параноик и питание ардуины стабильно и все "затыки" в первых 2 моментах, возможно для датчиков хватит стандартного ардуиновского внешнего подключаемого питалова... возможно блок питания от мобилки с лихвой заменит по качеству и всему прочему большинство самоделок, возможно и взять какой нить 9 вольтовый зарядник и стабилизировать его какой нибудь 7805 или AMS1117( но 7805 это печка а не стаб- у меня батарея есть квартиру греть, а 1117 какие то подозрительные милипусичные и обвязка на смд меня смущает- будет ли оно ловить внешние помехи и отдавать их в выходное напряжение да и смысл, если они же в ардуиновской питалке стоят?) но я же параноик... и потому прошу совета Отцов: пару схемок: одну простую и надежную как автомат Михаила Тимофеевича и вторую что-нить экстравагантно шизофреничное а ля золотые транзисторы навесным монтажом в корпусе оклеенном серебряными пулями крестами, чесноком и святой водой, с наклейкой HighEnd и обмотанное кабелем ODIN или Sommer Ну или валенков, что суету попусту развел , вот только в гугл не отправляйте, видели там-знаем
  5. Здравствуйте уважаемые форумчане. Суть: нужно изменить голос в реальном времени, создав устройство компактных размеров на базе arduino, которое можно было бы встроить в маску/шлем. С горем пополам, товарищи мне собирали аналоговые схемы, которые меняли голос, но меняли, мягко говоря, ужасно. Качество было на уровне детских игрушек. Заказывал с али подобные вещи - тоже плачевные результаты. Но программы справляются с этим прекрасно. Поэтому нужно сделать на arduino. Я не представляю как это делается, заказывать на стороне не хочу, т.к.: 1) будет дорого, 2) хотелось бы самому научиться делать это. Помогите пожалуйста. Может у вас есть уже такой проект. Что мне надо купить и где. Схемы если есть (свежие, не на древних компонентах). Советы, может обратиться к какому-нибудь умельцу местному (в Москве живу), чтобы показал/рассказал как что и где. Спасибо за внимание.
  6. Вывод на TV с Arduino

    Добрый день, подскажите пожалуйста как передать на телевизор изображение через RJ 6 кабель обычный с помощью Arduino Uno R3 ? Всем заранее спасибо за советы.
  7. Собрал ардуино - http://cxem.net/arduino/arduino61.php ,прошил. Все дело в том, что через USB программатор я могу заливать скетчи, а вот через USB порт нет ( Касаемо своих поисков решения проблемы: микросхема FT232R компьютером определяется (создается виртуальный порт COM3, при замыкании 0 и 1 пинов на ардуино отправляемый на порт набор символов возвращается без изменений). Понизил скорость порта до 4800 не помогло. Проверил соединения микросхем с контроллером, все в порядке. В чем бы еще могла быть проблема?
  8. Pascal для Ардуино

    Здравствуйте! С МК я знаком достаточно давно, теперь вот возникло желание заказать и немножечко помучить Ардуину (а точнее, ее китайский аналог Funduino Nano - но это не суть важно) - просто, чтобы понять, что это за зверь такой. Как известно, классической средой для написания программ ("скетчей") и прошивания Ардуины является Arduino IDE, язык которой - СИ. Но вот беда - не люблю я этот язык, за невменяемый и плохочитаемый синтаксис (писать вместо опрятного Паскалевского AND крякозябру &&, например - это нечто), и знаю его плохо (могу с некоторым усилием прочесть не очень сложный чужой код, и только). Зато Pascal очень нравится, и с Delphi сталкивался. Отсюда вопрос: существуют ли интегрированные программные комплексы для Ардуины, имеющие Пакскальский синтаксис и, так же как и Arduino IDE, имеющие встроенную функцию прошивальщика (т.е., построенные по принципу "все в одном"). Ну, и если такая среда существует, где взять для нее библиотеки - такие же удобные, как и у Arduino IDE? Или, может быть, существует какой-то плагин или патч для классической Arduino IDE, переводящий ее синтаксис на Паскальский? P.S. Я знаю-знаю, что СИ учить нужно (хотя, с AVRками до сих пор общаюсь на Ассемблере, а если совсем сложный проект - то беру MicroPascal). Я знаю, что в Arduino IDE используется очень упрощенная версия СИ - для домохозяек. И я знаю, что переучится с Паскаля на СИ (тем более упрощенный) - не так уж и сложно (главное - знать общие принципы программирования). Но... как-нибудь в другой раз: сейчас лениво что-то... P.P.S. СИшнки, только без холиворов, ладно? Обидеть никого не хотел!
  9. СГУ "крякалка" на AVR

    Есть проект СГУ на AVR. Музой проекта послужил не безызвестный проект СГУ на PIC. Хотел сделать его ещё в 2012 но знаний не хватало. А вот сейчас знаний хватает, вот и сбылась моя мечта. Пока что прикреплю видео, когда напишу статью о нем, ждите публикацию на ГЛ странице сайта. В качестве динамика использовал колонку от Соньки музыкалки.
  10. Нужно подключить ардуино (pro mini) для управления тремя аналоговыми мультиплексорами CD74HC4051. Управление "синхронное", то есть три управляющих входа и сигнал разрешения мультиплексоров подключаются друг к другу и к четырем выходам ардуино. Вопрос потянет ли ардуино? Не могу разобраться, как обозначается входной ток на datasheet. Или, если микросхема выполнена по КМОПовской технологоии, токи ничтожно малы и не указываются? Второй вопрос -- хотел бы сэкономить на управляющих выводах ардуино и просто заземлить сигнал разрешения мультиплексоров. Есть ли недостатки постоянного разрешения таких микросхем (вопрос возможных недостатков постоянной подключенности коммутируемых цепей опускаем) -- типа более быстрый износ, перегрев или т.п -- не знаю что еще там могло бы быть?
  11. Доброго времени суток!!! Я столкнулся с тем, что не работает UART и не реагирует на AT-команды. Пробовал с 2-мя переходниками: CH340 и FT232RL, тот, что в Arduino. Пробовал и менять контакты RX-TX местами, и скорость менял (должно быть 9600 бод) - терминал молчит от слова совсем. CH340 просто светит своим индикатором приема, а FT232 моргнет при включении и все. Должно выводиться в терминале при включении ON, но не выводится ничего и никак не реагирует. Проверял и обвязкой, и упрощенным подключением (4 провода - 2 питания и 2 UART), и напряжение то 3.3 делал, то 3.7, то питал с аккумулятора - молчание. Подумал, что UART нагнулся из-за моих кривых рук - махнулся с другом на свежую, проверить UART, но результат тот же, полагаю, что в моем даже и не сдох. А сам модуль работает, не считая злосчатного UART. Так в чем может быть проблема?
  12. Прошивка arduino через IAR

    Здравствуйте, подскажите пожалуйста как можно прошить контроллер внутри ардуино не вызывая при этом avrdude через своё IDE. Можно ли это сделать через какой либо встроенный в IAR инструмент? Я только сегодня установил иар, до этого через atmel studio пользовался дудцом и это не сильно удобно. Хочу узнать, может кто использует удобные способы) P.S. ничего не спрашивал на форумах 5 лет.
  13. Энкодер RGB лента

    я новичок Arduino, помогите написать скетч для управления RGB лентой (общий анод) с помощью энкодера (все мои попытки провалились ибо нет опыта роботы из Arduino ). Фишка в том что бы при повороте енкодера по часовой стрелке менялся цвет за формулой : Формула R-G-B начнем с красного цвета 255-0-0. 1) Наращивается зеленый цвет 255-1-0, 255-2-0 ... 255-255-0. 2) Уменьшается красный цвет 254-255-0, 253-255-0 ... 0-255-0. 3) Наращивается синий цвет 0-255-1, 0-255-2 ... 0-255-255. 4) Уменьшается зеленый цвет 0-254-255, 0-253-255 ... 0-0-255. 5) Наращивается красный цвет 1-0-255, 2-0-255 ... 255-0-255. 6) Уменьшается синий цвет 255-0-254, 255-0-253 ... 255-0-0. а вращение в обратную сторону приводило к обратному процесса с того места где остановились. (фактические это выбор цвета из не непрерывного спектра). ещё использован енкодер со встроенной кнопкой при нажатии кнопки загоралса белый цвет (то есть все цвета на максимум), при повторном нажатии на кнопку лента выключалась. ещё при подачи питания лента была выключена (но это не обязательно, это для того, чтобы случайный скачок напряжения в доме не включил подсветку) (хочу повторить как на видео ток под ардуино, в видео еще использован пульт но я думаю это слишком жырно такое просить) Movie.WMV
  14. Здравствуйте товарищи! На дмплом хочу заюзать приемники и передатчики 433МГц, которые любят Ардуинщики)) Я их переразведу на свою печать и схему восстановлю с реальной печати,но нужно указать в схеме какаие микры там работают. Кто-нибудь натыкался на схемы или может кто уже нашел состав модулей?
  15. Появилась необходимость собрать устройство на базе Arduino, которое работает с SD картой. Так как работа от аккумулятора, нужно максимально снизить ток потребления. Возникла проблема, если отключить питание SD карты, чтобы уйти в сон, после его возобновления работа с картой уже невозможна, при попытке пере инициализировать все виснет. Вопрос, как лучше реализовать отключение SD карты?
  16. И так имею экран от телефона Samsung SGH-C230 и хочу его подключить к Arduino UNO и чтобы работал, мне нужна схема подключения и прошивка (прошивка должна быть на родном языке Arduino IDE, так как других я не знаю)? Пожалуйста помогите, фотки экрана будут ниже.
  17. Добрый день! Столкнулся с такой проблемой, пытаюсь взаимодействовать с чипом AFE4300 по SPI. В дотащите указано, что уровень сигнала 2 - 3 вольта. Подключаю к nrf51 (использует уровень 3.3 вольта), ресетю и пытаюсь прочитать дефолтное значение регистра (0x01C3), в итоге получаю 0xFFFF. Перепроверил на Arduino Mega 2560, где уровень сигнала 5 вольт (подключил напрямую без level shifter) и считал свои дефолтные значения. Попробовал также считать другие 4 регистра, все также отлично считалось. Вот теперь не пойму, в дотащите указано не верно или у меня что-то не то. Еще вопрос про согласовать уровней TXB0108. Пытался через нее прокинуть сигнал от nrf51 (3.3v) на afe4300. Питание А - 3.3в, каналы А к nrf51, питание Б 5в, каналы Б к afe4300, OE к 3.3в. Не завелось, даже анализатор говорит, что MOSI шлет 0xFF, вместо реальных данных. Земля везде общая. Правда есть оговорка, как данный уровень ко мне приехал я мог по ошибке запитать Б 3 вольтами, а А 5 вольтами. Но даташит на него говорит, что когда А > Б, это не повреждает чип, хотя А должно быть до 3.6 вольт. Еще мог OE подключить к 5 вольтам. В общем, могли ли мои неразумные операции вывести его из строя??? Еще в даташите указано, что неиспользуемые каналы надо подключить либо к питанию, либо к земле. Это может влиять на то, что я сейчас получаю?
  18. Добрый день! Приобрёл китайскую Arduino UNO r3. Не загружает СКЕТЧ чего только не делал! При включении загорается зелёный светодиод питания и постоянно мигает синий "L" Все настройки сделал. Com порт выбран правильно. Драйвер CH340 поставил. В диспетчере устройств видится как USB-SERIAL CH340. Скетч компилируется корректно. Менял разные версии Ардуино IDE. Замыкал TXи RX ответ есть, При загрузке, в начале, вспыхивает светодиод TX раза 3-4 (как бы загрузка прошла ) потом опять начинает мигать L, то есть исполняется старый скетч. Ардуино IDE в это же время, продолжает как бы загружать скетч, но очень долго , после чего выдаёт вот такую ошибку: Arduino: 1.6.3 (Windows 7), Плата"Arduino Uno" avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x03 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x03 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x03 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x03 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x03 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x03 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x03 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x03 avrdude: stk500_recv(): programmer is not responding Проблема загрузки на плату. Для достижения дзен, курить http://www.arduino.cc/en/Guide/Troubleshooting#upload . avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x03 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x03 Это сообщение будет содержать больше информации чем "Отображать вывод во время компиляции" включено в Файл > Настройки До этого покупал такой же и проблем не было! Подскажите в чём дело?
  19. Питание MQ135 Arduino

    Заранее извиняюсь если вопрос для многих будет примитивным, но так как в радиотехнике 0 - прошу помощи. Итак: есть Arduino mini, различные датчики, датчик MQ135(потребление ~150mA). Питание: к пинам +5,Gnd припаян Microusb для подключения зарядника от телефона (но также хочу дать возможность запитать от 3 батареек). вопрос: 1. как сделать обвязку чтобы при подключении внешнего источника питания, питание от батареек не тратилось? 2. MQ135 пишут везде нужно свое питание но если я запитаю от внешнего источника его и ардуино то никаких проблем не возникнет? 3. надо датчик MQ135 включать периодически допустим раз в 10мин на 2 мин c помощю ардуино, какие элементы могут помочь в этом?(использовать реле мне кажеться как с ружья по воробьям)
  20. Эта статья является логическим продолжением вот этой статьи про монохромный OLED дисплей. На этот раз мне в руки достался цветной OLED дисплей, разрешением 96*64 пикселя от магазина Banggood (ссылка на дисплей) Пока не забыл, на странице товара есть ссылка на архив с документацией на дисплей. Кроме того достаточно информации по дисплею встречается в сети, так же есть готовые библиотеки для нетерпеливых (от Adafruit, Seeed-Studio и конечно же монстр среди библиотек для дисплеев U8Glib). Я же покажу работу с дисплеем безо всяких библиотек, покажу в среде программирования ArduinoIDE, что бы было понятно новичкам (матерые программисты наверняка разберутся). Итак, дисплей может подключаться при помощи параллельных интерфейсов (6800, 8080) и последовательного интерфейса SPI. В модуле, который попал мне в руки, реализован SPI протокол. Распиновка слева-направо: 2 вывода для питания, SCL - предназначен для тактового сигнала, SDA - по этому входу в контроллер дисплея поступают данные, RES - предназначен для сброса дисплея, DC (data/command) - логический сигнал на этом входе сообщает дисплею что в данный момент передается, данные или команда (об этом чуть позже подробнее), CS - обычный chip select протокола SPI, низкий уровень на этом входе сообщает дисплею, что данные, поступающие по нему, предназначены именно для дисплея. Подробно вдаваться в суть протока SPI я не буду, стоит только уточнить, что дисплей работает в режиме SPI_MODE3 (CPOL=1, CPHA=1). Вас могут смутить обозначения SDA и SCL, ведь они применяются для обозначения выводов устройств, работающих по протоколу I2C, но всё на самом деле не так плохо. Поскольку по линии SDA идут данные от микроконтроллера к дисплею - он подключается к выводу MOSI микроконтроллера (D11 на ардуино). По SCL идут тактовые сигналы, а значит он подключается к выводу SCK микроконтроллера (D13 на ардуино). Для выводов RES, DC и CS можно выбрать любые выводы (у меня D10 для CS, D8 для DC и D9 для RES). Библиотека SPI не будет управлять этими выводами, это придется делать вручную. Разберемся для чего нужен каждый из этих выводов. CS - самое простое, логический 0 говорит дисплею о том, что данные предназначены для него, логическая 1 - о том что передача данных завершена. RES - служит для сброса дисплея, для этого надо на некоторое время подать на этот вывод логический 0. Это необходимо сделать один раз в начале программы перед инициализацией дисплея. DC - логический 0, подаваемый на этот вывод, сообщает дисплею о том, что передаются команды, логическая 1 - передаются данные. На основании этого создаем две функции для отправки команды и данных соответственно. #include <SPI.h> const int ss = 10; //slave select const int dc = 8; // data/command data=1 command=0 const int reset = 9; //oled reset=0 void oledCommand(uint8_t val) //общая функция отправки команды дисплею { digitalWrite(ss, LOW); //slave select устанавливаем в 0, это активирует SPI digitalWrite(dc, LOW); //DC равен 0, это значит что отправляется команда SPI.transfer(val); //отправляем команду стандартной функцией библиотеки SPI digitalWrite(ss, HIGH); //slave select устанавливаем в 1, это означает что работа с SPI завершена } void oledData(uint8_t val) //общая функция отправки данных дисплею { digitalWrite(ss, LOW); //slave select устанавливаем в 0, это активирует SPI digitalWrite(dc, HIGH); //DC равен 1, это значит что отправляются данные SPI.transfer(val); //отправляем данные стандартной функцией библиотеки SPI digitalWrite(ss, HIGH); //slave select устанавливаем в 1, это означает что работа с SPI завершена } void setup() { pinMode(ss, OUTPUT); pinMode(dc, OUTPUT); pinMode(reset, OUTPUT); SPI.begin(); SPI.setDataMode(SPI_MODE3); oledInit(); } void setup() { pinMode(ss, OUTPUT); pinMode(dc, OUTPUT); pinMode(reset, OUTPUT); SPI.begin(); SPI.setDataMode(SPI_MODE3); oledInit(); } Обратите внимание на функция oledInit() в предпоследней строке кода. Прежде чем дисплей сможет что-либо выводить на экран, его необходимо настроить (инициализировать). Для этого посылаем команды, приведенные в следующей диаграмме. init.PNG В программе это будет выглядеть так: void oledInit() //функция инициализации дисплея { digitalWrite(reset, HIGH); //процедура сброса дисплея delay(100); digitalWrite(reset, LOW); delay(100); digitalWrite(reset, HIGH); delay(100); //процедура инициализации дисплея digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0xAE); //display OFF SPI.transfer(0xA0); //remap & color depth setting SPI.transfer(0x72); //b01110010 расшифровка ниже /* b01 - 65k format, (00 -256 color, 10 - 65k color format 2) 1 - enable COM split odd even (0 - disable) 1 - scan COM95 to COM0 (0 - COM0 to COM95) отражение по короткой стороне 0 - disable left-right swaping (1 - enable swaping) 0 - RGB color (1 - BGR color) 1 - RAM column 0 to 95 (0 - 95 to 0) 0 - horizontal address increment (1 - vertical) */ SPI.transfer(0xA1); //set display start line (0-63) SPI.transfer(0x0); SPI.transfer(0xA2); //set vertical offset (0-63) SPI.transfer(0x0); SPI.transfer(0xA4); //normal display (A5 - all pixel ON, A6 - all pixel OFF, A7 - inverse display) SPI.transfer(0xA8); //set MUX ratio N+1 mux SPI.transfer(0x3F); //default 0x3F SPI.transfer(0xAD); //select internal Vcc supply SPI.transfer(0x8E); //default 0x8E SPI.transfer(0xB0); //set power saving mode SPI.transfer(0x0B); //default 0x0B (disable power saving mode) 0X1A - enable SPI.transfer(0xB1); //set reset, pre-charge period SPI.transfer(0x31); //default 0x31 SPI.transfer(0xB3); //oscillator frequency SPI.transfer(0xF0); //default 0xF0 SPI.transfer(0x8A); //set second pre-charge color A SPI.transfer(0x64); //default 0x64 SPI.transfer(0x8B); //set second pre-charge color B SPI.transfer(0x78); //default 0x78 SPI.transfer(0x8C); //set second pre-charge color C SPI.transfer(0x64); //default 0x64 SPI.transfer(0xBB); //set pre-charge voltage level SPI.transfer(0x3A); //default 0x3A SPI.transfer(0xBE); //set COM deselect voltage level SPI.transfer(0x3E); //default 0x3E SPI.transfer(0x87); //set master current SPI.transfer(0x06); //default 0x06 SPI.transfer(0x81); //set contrast for color A SPI.transfer(0x91); //default 0x91 SPI.transfer(0x82); //set contrast for color B SPI.transfer(0x50); //default 0x50 SPI.transfer(0x83); //set contrast for color C SPI.transfer(0x7D); //default 0x7D SPI.transfer(0xAF); //display ON, normal mode digitalWrite(ss, HIGH); } Теперь дисплей готов к выводу изображения. Но стоит рассмотреть некоторые команды. В частности очень важны следующие строки: SPI.transfer(0xA0); //remap & color depth setting SPI.transfer(0x72); //b01110010 расшифровка ниже /* b01 - 65k format, (00 -256 color, 10 - 65k color format 2) - здесь мы выбираем в каком формате будут задаваться цвета и сколько цветов будет возможно использовать Поскольку выбираем 65 тысяч цветов, то значение цвета в один байт не поместится, только в два байта. 1 - enable COM split odd even (0 - disable) 1 - scan COM95 to COM0 (0 - COM0 to COM95) отражение по короткой стороне 0 - disable left-right swaping (1 - enable swaping) 0 - RGB color (1 - BGR color) задаем привычный нам формат RGB 1 - RAM column 0 to 95 (0 - 95 to 0) 0 - horizontal address increment (1 - vertical) */ Выбираем как будут выводиться данные на дисплей, слева-направо сверху-вниз (привычный нам способ, потому что и пишем так и массивы задаем) или сверху-вниз слева-направо. Эти методы адресации рассмотрены в предыдущей статье, лишь отмечу что мы будем использовать горизонтальную адресацию. Поскольку для задания цвета у нас есть всего 2 байта, а формат RGB предполагает 3, то необходимо произвести преобразование. Для красного цвета отводятся первые 5 бит, затем 6 бит зеленого цвета, замыкают 5 бит синего, поэтому функцию преобразования цвета я назвал color565 uint16_t c; c = r >> 3; c <<= 6; c |= g >> 2; c <<= 5; c |= b >> 3; return c;// получаем 16-битное значение цвета и возвращаем его } Поскольку данными необходимо передавать только цвет, то функцию передачи данных можно переделать в функцию передачи цвета, но 16-битное значение цвета необходимо будет разбить на два 8-битных и послать их одно за другим. void oledDataColor(uint16_t color) //измененная функция для отправки 16-битного значения цвета { digitalWrite(ss, LOW); digitalWrite(dc, HIGH); SPI.transfer(color >> 8); //разбиваем 16-битное значение на 2 8-битных SPI.transfer(color); digitalWrite(ss, HIGH); } Теперь можно рисовать, и начну я с базового элемента любого растрового изображения - пикселя. Для отображения графических примитивов предусмотрены готовые функции, но не для пикселя и окружности, поэтому будем изобретать велосипед. Я упоминал про горизонтальную адресацию, команды и данные, и сейчас я свяжу это всё воедино и поведаю как вывести изображение на дисплей (но делать я этого конечно же не буду). Представим, что необходимо вывести изображение размером N на N пикселей, левый верхний угол изображения должен находиться в координатах х=X, у=Y. Для этого необходимо выбрать прямоугольную область на дисплее, а затем передать значения цвета пикселей по очереди обходя каждый пиксель изображения слева-направо сверху-вниз. Полученные дисплеем значения цвета так же будут выводиться слева-направо сверху-вниз в пределах выбранной области, и обход пикселей будет таким, как представлен на изображении ниже. Для выбора области на дисплее необходимо передать команду 0x15,значения Х и У левого верхнего угла области, затем команду 0x75 и значения Х и У правого нижнего угла области. Все эти значения передаются командами, то есть вывод DC подтянут к нулю. Затем подаем на DC логическую единицу и посылаем значения цвета каждого пикселя. Функции отправки команд, данных и цвета я уже привел. Далее необходимо включить фантазию и принять факт что один пиксель - это изображение состоящее из одного пикселя, и процедуру вывода изображения применить к одному единственному пикселю. В итоге получается вот такая функция: //функция задает цвет выбранной точке void oledPixel(uint8_t x, uint8_t y, uint16_t color) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x15); SPI.transfer(x); SPI.transfer(95); SPI.transfer(0x75); SPI.transfer(y); SPI.transfer(63); delay(1); digitalWrite(dc, HIGH); SPI.transfer(color >> 8); SPI.transfer(color); delay(1); digitalWrite(ss, HIGH); } Далее пойдут уже готовые функции для вывода линии, прямоугольника и залитого прямоугольника. //функция отрисовывает линию определенного цвета между двумя указанными координатами void oledLine (uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint16_t color) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x21); SPI.transfer(x1); //x start SPI.transfer(y1); //Y start SPI.transfer(x2); //X end SPI.transfer(y2); //Y end delay(1); //здесь синтезированный в формат 565 цвет разбирается отбратно //я понимаю что это костыль, но во первых для задания цвета необходимо использовать один аргумент вместо трех //а во вторых, я использовал именно такой способ для общего понимания работы с цветом при работе с данным дисплеем SPI.transfer((color >> 11) & 0x1F); //R color SPI.transfer((color >> 5) & 0x3F); //G color SPI.transfer(color & 0x1F); //B color delay(1); digitalWrite(ss, HIGH); } //функция рисует прямоугольник заданной высоты ширины и цвета, левый верхний угол прямоугольника задается первыми двумя аргументами void oledRect (uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t colorFrame) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x26); //настройка заливки прямоугольника SPI.transfer(0x0); //отключаем заливку прямоугольника SPI.transfer(0x22); SPI.transfer(x); //x start SPI.transfer(y); //Y start SPI.transfer(x + w); //X end SPI.transfer(y + h); //Y end delay(1); SPI.transfer((colorFrame >> 11) & 0x1F); //R color frame SPI.transfer((colorFrame >> 5) & 0x3F); //G color SPI.transfer(colorFrame & 0x1F); //B color delay(10); digitalWrite(ss, HIGH); } //то же самое, но прямоугольникк залит определенным цветом (6 аргумент задает цвет заливки) void oledRectFill (uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t colorFrame, uint16_t colorFill) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x26); //настройка заливки прямоугольника SPI.transfer(0x1); //включаем заливку прямоугольника SPI.transfer(0x22); SPI.transfer(x); //x start SPI.transfer(y); //Y start SPI.transfer(x + w); //X end SPI.transfer(y + h); //Y end delay(1); SPI.transfer((colorFrame >> 11) & 0x1F); //R color frame SPI.transfer((colorFrame >> 5) & 0x3F); //G color SPI.transfer(colorFrame & 0x1F); //B color SPI.transfer((colorFill >> 11) & 0x1F); //R color fill SPI.transfer((colorFill >> 5) & 0x3F); //G color SPI.transfer(colorFill & 0x1F); //B color delay(10); digitalWrite(ss, HIGH); } Так же предусмотрена функция очистки прямоугольной области дисплея и она же используется для очистки всего дисплея. void oledClear(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x25); SPI.transfer(x1); SPI.transfer(y1); SPI.transfer(x2); SPI.transfer(y2); delay(1); digitalWrite(ss, HIGH); } void oledClearAll() { oledClear(0, 0, 95, 63); } И ещё команды скролинга дисплея. В них я глубоко не вникал, заставил картинку двигаться вертикально, но не смог заставить двигаться горизонтально. На том и хватит, я вряд ли буду использовать эти команды. //настройка скролинга дисплея void oledScrollSetup (uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t e) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x27); SPI.transfer(a); SPI.transfer(b); SPI.transfer(c); SPI.transfer(d); SPI.transfer(e); delay(1); digitalWrite(ss, HIGH); } void oledScrollOn() { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x2F); digitalWrite(ss, HIGH); } void oledScrollOff() { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x2E); digitalWrite(ss, HIGH); } Приведу весь код "скетча". #include <SPI.h> const int ss = 10; //slave select const int dc = 8; // data/command data=1 command=0 const int reset = 9; //oled reset=0 void oledCommand(uint8_t val) //общая функция отправки команды дисплею { digitalWrite(ss, LOW); //slave select устанавливаем в 0, это активирует SPI digitalWrite(dc, LOW); //DC равен 0, это значит что отправляется команда SPI.transfer(val); //отправляем команду стандартной функцией библиотеки SPI digitalWrite(ss, HIGH); //slave select устанавливаем в 1, это означает что работа с SPI завершена } void oledData(uint8_t val) //общая функция отправки данных дисплею { digitalWrite(ss, LOW); //slave select устанавливаем в 0, это активирует SPI digitalWrite(dc, HIGH); //DC равен 1, это значит что отправляются данные SPI.transfer(val); //отправляем данные стандартной функцией библиотеки SPI digitalWrite(ss, HIGH); //slave select устанавливаем в 1, это означает что работа с SPI завершена } void oledDataColor(uint16_t color) //измененная функция для отправки 16-битного значения цвета { digitalWrite(ss, LOW); digitalWrite(dc, HIGH); SPI.transfer(color >> 8); //разбиваем 16-битное значение на 2 8-битных SPI.transfer(color); digitalWrite(ss, HIGH); } void oledInit() //функция инициализации дисплея { digitalWrite(reset, HIGH); //процедура сброса дисплея delay(100); digitalWrite(reset, LOW); delay(100); digitalWrite(reset, HIGH); delay(100); //процедура инициализации дисплея digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0xAE); //display OFF SPI.transfer(0xA0); //remap & color depth setting SPI.transfer(0x72); //b01110010 расшифровка ниже /* b01 - 65k format, (00 -256 color, 10 - 65k color format 2) 1 - enable COM split odd even (0 - disable) 1 - scan COM95 to COM0 (0 - COM0 to COM95) отражение по короткой стороне 0 - disable left-right swaping (1 - enable swaping) 0 - RGB color (1 - BGR color) 1 - RAM column 0 to 95 (0 - 95 to 0) 0 - horizontal address increment (1 - vertical) */ SPI.transfer(0xA1); //set display start line (0-63) SPI.transfer(0x0); SPI.transfer(0xA2); //set vertical offset (0-63) SPI.transfer(0x0); SPI.transfer(0xA4); //normal display (A5 - all pixel ON, A6 - all pixel OFF, A7 - inverse display) SPI.transfer(0xA8); //set MUX ratio N+1 mux SPI.transfer(0x3F); //default 0x3F SPI.transfer(0xAD); //select internal Vcc supply SPI.transfer(0x8E); //default 0x8E SPI.transfer(0xB0); //set power saving mode SPI.transfer(0x0B); //default 0x0B (disable power saving mode) 0X1A - enable SPI.transfer(0xB1); //set reset, pre-charge period SPI.transfer(0x31); //default 0x31 SPI.transfer(0xB3); //oscillator frequency SPI.transfer(0xF0); //default 0xF0 SPI.transfer(0x8A); //set second pre-charge color A SPI.transfer(0x64); //default 0x64 SPI.transfer(0x8B); //set second pre-charge color B SPI.transfer(0x78); //default 0x78 SPI.transfer(0x8C); //set second pre-charge color C SPI.transfer(0x64); //default 0x64 SPI.transfer(0xBB); //set pre-charge voltage level SPI.transfer(0x3A); //default 0x3A SPI.transfer(0xBE); //set COM deselect voltage level SPI.transfer(0x3E); //default 0x3E SPI.transfer(0x87); //set master current SPI.transfer(0x06); //default 0x06 SPI.transfer(0x81); //set contrast for color A SPI.transfer(0x91); //default 0x91 SPI.transfer(0x82); //set contrast for color B SPI.transfer(0x50); //default 0x50 SPI.transfer(0x83); //set contrast for color C SPI.transfer(0x7D); //default 0x7D SPI.transfer(0xAF); //display ON, normal mode digitalWrite(ss, HIGH); } uint16_t color565(uint8_t r, uint8_t g, uint8_t b) //функция преобразования цвета R8G8B8bit в формат R5G6B5bit { uint16_t c; c = r >> 3; c <<= 6; c |= g >> 2; c <<= 5; c |= b >> 3; return c;// получаем 16-битное значение цвета и возвращаем его } //функция задает цвет выбранной точке void oledPixel(uint8_t x, uint8_t y, uint16_t color) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x15); SPI.transfer(x); SPI.transfer(95); SPI.transfer(0x75); SPI.transfer(y); SPI.transfer(63); delay(1); digitalWrite(dc, HIGH); SPI.transfer(color >> 8); SPI.transfer(color); delay(1); digitalWrite(ss, HIGH); } void oledSetArea(uint8_t x, uint8_t y, uint8_t w, uint8_t h) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x15); SPI.transfer(x); SPI.transfer(y); SPI.transfer(0x75); SPI.transfer(x + w); SPI.transfer(y + h); delay(1); digitalWrite(ss, HIGH); } //функция отрисовывает линию определенного цвета между двумя указанными координатами void oledLine (uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint16_t color) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x21); SPI.transfer(x1); //x start SPI.transfer(y1); //Y start SPI.transfer(x2); //X end SPI.transfer(y2); //Y end delay(1); //здесь синтезированный в формат 565 цвет разбирается отбратно //я понимаю что это костыль, но во первых для задания цвета необходимо использовать один аргумент вместо трех //а во вторых, я использовал именно такой способ для общего понимания работы с цветом при работе с данным дисплеем SPI.transfer((color >> 11) & 0x1F); //R color SPI.transfer((color >> 5) & 0x3F); //G color SPI.transfer(color & 0x1F); //B color delay(1); digitalWrite(ss, HIGH); } //функция рисует прямоугольник заданной высоты ширины и цвета, левый верхний угол прямоугольника задается первыми двумя аргументами void oledRect (uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t colorFrame) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x26); //настройка заливки прямоугольника SPI.transfer(0x0); //отключаем заливку прямоугольника SPI.transfer(0x22); SPI.transfer(x); //x start SPI.transfer(y); //Y start SPI.transfer(x + w); //X end SPI.transfer(y + h); //Y end delay(1); SPI.transfer((colorFrame >> 11) & 0x1F); //R color frame SPI.transfer((colorFrame >> 5) & 0x3F); //G color SPI.transfer(colorFrame & 0x1F); //B color delay(10); digitalWrite(ss, HIGH); } //то же самое, но прямоугольникк залит определенным цветом (6 аргумент задает цвет заливки) void oledRectFill (uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t colorFrame, uint16_t colorFill) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x26); //настройка заливки прямоугольника SPI.transfer(0x1); //включаем заливку прямоугольника SPI.transfer(0x22); SPI.transfer(x); //x start SPI.transfer(y); //Y start SPI.transfer(x + w); //X end SPI.transfer(y + h); //Y end delay(1); SPI.transfer((colorFrame >> 11) & 0x1F); //R color frame SPI.transfer((colorFrame >> 5) & 0x3F); //G color SPI.transfer(colorFrame & 0x1F); //B color SPI.transfer((colorFill >> 11) & 0x1F); //R color fill SPI.transfer((colorFill >> 5) & 0x3F); //G color SPI.transfer(colorFill & 0x1F); //B color delay(10); digitalWrite(ss, HIGH); } void oledClear(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x25); SPI.transfer(x1); SPI.transfer(y1); SPI.transfer(x2); SPI.transfer(y2); delay(1); digitalWrite(ss, HIGH); } void oledClearAll() { oledClear(0, 0, 95, 63); } //настройка скролинга дисплея void oledScrollSetup (uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t e) { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x27); SPI.transfer(a); SPI.transfer(b); SPI.transfer(c); SPI.transfer(d); SPI.transfer(e); delay(1); digitalWrite(ss, HIGH); } void oledScrollOn() { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x2F); digitalWrite(ss, HIGH); } void oledScrollOff() { digitalWrite(ss, LOW); digitalWrite(dc, LOW); SPI.transfer(0x2E); digitalWrite(ss, HIGH); } void setup() { pinMode(ss, OUTPUT); pinMode(dc, OUTPUT); pinMode(reset, OUTPUT); SPI.begin(); SPI.setDataMode(SPI_MODE3); oledInit(); oledClearAll(); randomSeed(millis); } void loop() { oledClearAll(); oledPixel(10, 10, color565(255, 0, 0)); oledLine(45, 32, 40, 63, color565(0, 255, 0)); oledRectFill(60, 0, 10, 20, color565(0, 0, 255), color565(255, 255, 0)); oledRect(40, 0, 10, 20, color565(255, 255, 0)); int x = 20, y = 31, w = 10, h = 10; oledSetArea(x, y, w, h); for (int i = 0; i < (w*h); i++) { oledDataColor(color565(random(0, 255), random(0, 255), random(0, 255))); } delay(5000); } Результат работы на фото (специально сдвинул экспозицию в минус): вывод точки, линии, залитого и пустого прямоугольника и массива из точек случайного цвета. Плюсы данного дисплея очевидны: малое потребление из-за отсутствия подсветки, малая толщина дисплея, большие углы обзора, ну и наконец он цветной. Чип SSD1331 позволяет обращаться к каждой точке напрямую ( в отличии от монохромного дисплея на чипе SSD1306), что намного упрощает работу с ним. Ну и библиотеки для этого дисплея уже написаны, а то я тут всё велосипеды изобретаю. P.S. В архиве скетч, библиотеки для ArduinoIDE и даташиты. SSD1331.rar
  21. Привет всем. первый раз держу ардуинку. Поставили такую задачу: На руки дали Arduino Mega 2560 R3 и такую задачу. надо задействовать 8 входов, а остальное выходы оставшиеся (их там много). Надо сделать так что бы эти 8 входов были расширены таким способом.: Допустим на вход 1 подаем единичку а на другом выходе тоже единичка и так до восьми входов., но далее мы подаем комбинацию вход 1 и 2 вместе подаем по единичке и единичка выходит еще на одном свободном выходе и так со всеми восемью входами. например имеем входы 1,2,3,4,5,6,7,8, и делаем такую комбинацию после того как все выходы исчерпаны по одиночному подключению вход и выход. продолжаем дальше вход1+2=выход9 и так далее: 1+3=10, 1+4=11, 1+5=12... потом 2+2=...2+3...2+4... и так далее пока не закончатся все выходы. Теперь вопрос от человека первый раз державшего на руках вышеописанный девайс: Как это нарисовать в скетче? БлагоДарю!
  22. Привет, прошу помощи что и как сделать. Кратко, есть пасека с пчелами небольшая. Нужно сделать 1) Под улей поставить 4 тензодатчика каждый на 50кг (как у напольных электронных весов) через модуль АЦП HX711 2) Во внутрь улья, датчик влажности и температуры DHT11 (неважно какой) Пока всё, есть ещё идея сделать "Частотный анализатор" что-бы отслеживать состояние семьи ( возбужденное или спокойное) но как это сделать пока понятия не имею, в дальнейшем добавить датчик детонации, когда будет gsm модуль. Не знаю как делать, чтоб Arduino опрашивал датчики с интервалом раз в 2 часа и отправлял результат на rasbery pi 3 а он чтоб составлял хронологию (график изменения) на apache сервере. А я мог подключиться к нему к примеру прямо там в поле через wi-fi с телефона и всё посмотреть.(в дальнейшем добавить gsm модуль и отправлял в инет всю информацию.) Или делать сразу всё на Rasbery pi 3. Но ведь мне так не хватит одного Rasbery pi 3 что бы за питать все датчики от всех ульев. Прошу помощи, совета что и как сделать лучше. Делаю для себя.
  23. Микрофон + arduino

    Здравствуйте! Собрал приложенную схему, подключил к arduino uno. Ожидал я получить громкость окружающей среды, но получилось как-то не очень. Значения на аналоговом входе в тишине пляшут от 310 до 380. Если дуть в микрофон, то разброс значений от 0 до 555. На музыку или голос почти не реагирует. Что я делаю или понимаю не так? Спасибо.
  24. Всем привет. Недавно я задался вопросом изготовления коммутатора sim карт. Готовые решения есть на рынке, но мне забавы ради тратить пару сотен убитых енотов откровенно говоря не охота. Решил сделать POC своими руками. Идея простая - сим карты подключены к модему и в нужный момент ардуинка переключает с одной сим карты на другую. Для этих целей я использую твердотельный реле, которые и переключают физически контакты с одной сим карты на другую. И теперь вопрос знатокам: можно ли как-то упростить схему, исключив громоздкие ssr, и задействовав например транзисторы?
  25. Интересна тематика связанная с "умный дом" или rfid