Перейти к содержанию

Поиск сообщества

Показаны результаты для тегов 'arduino'.

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

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

Тип контента


Форумы

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

Блоги

  • Твори, выдумывай, пробуй.
  • fant's блог
  • Ток покоя
  • Где купить велпатасвир, epclusa, velpanat, velasof, софосбувир в России по лучшей цене.
  • Китайские бренды видеокамер
  • Создание Маленькой Мастерской
  • Блог администрации
  • STEN50's блог
  • Изучение, наладка, исследование
  • MiSol62's блог
  • короткие записки по ходу дела
  • Программирование AVR и PIC блог
  • Стабилизированный выпрямитель тока ТЕС 12-3-НТ
  • Блог getshket
  • ТНПА
  • welder's блог
  • blog cheloveka loshadi
  • OPeX3's блог
  • Подводная робототехника
  • Сабвуфер и акустика.
  • Радиоуправляемая машина
  • Консультация психолога сексолога онлайн, психолог онлайн
  • Nokian блог
  • Оповещения Dermabellix Scam !! Не покупайте это !!!
  • Cheerful Boss' блог
  • Cheerful Boss' блог
  • VLAD1996B's блог
  • "Коллективное увеличение продаж"
  • Dudok's блог
  • "Коллективное увеличение продаж"
  • Goluboglazyi's блог
  • Прибор определяющий электролитический конденсатор на работоспособность.
  • Mosfet@'s блог
  • mazzi's блог
  • Лучшие компьютерные игры 2017
  • Marchenkokerya's блог
  • Заметки начинаущего аудиофила
  • Почти бесполезные проги
  • Светлый блог.
  • дядюшка Филин's блог
  • Дневники нуба
  • satyrn's блог
  • Люк. В погреб.
  • Фильм Дом Солнца
  • Светодиодная лента B-LED 2835-120 W белая негерметичная
  • Само-Реплицируещиеся Производственные Системы
  • Блог от Eknous
  • РВС's блог
  • Den_R's blog
  • РВС's блог
  • Чтото крутое и про криворукость
  • ekadom's блог
  • Проектирование любых чертежей
  • Lisovic's блог
  • Блог уже не юного радиогубителя
  • денди
  • eHouse
  • zaregan's блог
  • Схемотехника УНЧ с низковольтным питанием на примере приёмников фирмы Grundig
  • То, что в руки попало.
  • Блок питания водородного генератора и все что с ним связано
  • slava_va@mail.ru's блог
  • Блог alex123al97
  • slava_va@mail.ru's блог
  • параленое соединение КРЕНок или как сделать стабилизатор напряжения 24-12в
  • Свободная генерация Андрея Мельниченко
  • реобас
  • Модернизации системы впрыска на 555
  • помощь
  • Копии схем и печатных плат устройств попавшие ко мне
  • MBM75's блог
  • Буду
  • lagutai's блог
  • Мои проекты.
  • lagutai's блог
  • Трудовик
  • vOVK@'s блог
  • токарь-радиолюбитель
  • azlk3000's блог
  • Коллизия сингулярности
  • SmallAlex's блог
  • Вопрос по Цифровому усилителю мощности звука 2x12 Вт YDA138-E
  • bebulo's блог
  • Простейший макет станка термо-вакуумной формовки
  • Блог им. pryanic
  • peratronika
  • Zer's блог
  • MEDBEDb's
  • Гнездо кукушки
  • hiMiческий блог
  • luna_kamen's блог
  • Изучаем USI на основе сверхэкономичного прототипа
  • Алекс-Юстасу
  • SUBWOOFER.RU
  • kot sansher's блог
  • Поделки стареющего пионера
  • доброжелатель2's блог
  • Grig96. Полезные заметки.
  • Attiny 0-ой и 1-ой серии (Attiny817, 1614 и прочие)
  • pavlo's блог
  • MSP430FR
  • viper2's блог
  • Моя Электро Чинильня
  • Selyk's блог
  • VoltServis.ru
  • kpush's блог
  • OM3 на новых платах.
  • конни's блог
  • Электронный экстазёр "MASHKA".
  • ptimai's блог
  • noc functionalities
  • Sun kapitane's blog
  • ODEON AV-500
  • Sun kapitane's blog
  • Логика на транзисторах,диодах, счетние тригери на транзисторах
  • AleksandrBulchuck's блог
  • Качественные окна от производителя
  • KRALEX's блог
  • Javaman's projects
  • SeVeR36's блог
  • 3232
  • Пять копеек.
  • Az@t's блог
  • Индукционный нагрев
  • Схемы разных устройств
  • Кардшаринг SAT ТВ блог
  • PENTAGRID SAYS
  • Ещо раз о "Кощее 5И"
  • Игровые автоматы на официальном сайте
  • коллекционер
  • дямон's блог
  • Ламповый усилитель и акустика для озвучки семейных мероприятий
  • дямон's блог
  • tiosmutoutrup1971
  • Светомузыкальная установка для новачков
  • Лучшие игры для ПК скачать бесплатно
  • sqait's блог
  • Блокнотик
  • Gubernator's блог
  • Записки электрика
  • Полстакана
  • Vrednyuka
  • Интегральные микросхемы
  • grigorik's блог
  • Интегральные микросхемы
  • VMWare удобство и безопастность
  • Профсоюз обычных пользователей
  • rtfcnf's блог
  • Гидроэнергетика в России: отечественные гидроэлектростанции, типы и характеристики
  • VMWare удобство и безопастность
  • Лайфхаки от Кати
  • Kinh chong anh sang xanh gia re
  • ukabumaga's блог
  • АО "Диполь Технологии"
  • artos5's блог
  • блог
  • Kraftwerk's блог
  • 1
  • Kraftwerk's блог
  • Как выбрать точечный светильник?
  • мастерская ky3ne4ik'а
  • Работа с микроконтроллером Atmega8
  • Aronsky
  • Игорь Камский
  • Диммеры
  • 5В = 1,5+3
  • vitiv' блог
  • Ремонт цифровой панели прибора тойоты марк 100. Замена транзистора 36 ( SOT- 23 )PNP
  • Все СРО России
  • 300writers
  • Металлоискатель Tracker FM-1D3
  • Былое
  • Создание монстра "Blaster 8920"
  • 2Smart Cloud Blog
  • EmmGold's блог
  • 2Smart Cloud Blog
  • ivan15961596's блог
  • Кумир у-001
  • ivan15961596's блог
  • My blog
  • Интернет радио в машину
  • SamON
  • Помогите люди добрые
  • AI
  • Помогите подключить маяк 231 стерео.
  • Гаусс-пушки
  • Название
  • 7400's блог
  • Как я собирал свой первый импульсный источник питания
  • Віталік Приходько_130349's блог
  • Lithium ECAD - российская САПР печатных плат
  • Евгений Малюта's блог
  • ПИшу свои мысли
  • werekpro
  • Venera Electronica
  • afurgon's блог
  • Выбросьте это в парашу!
  • odaplus' блог
  • Zvik's блог
  • Smart overload protection power amplifier «Zita (Z) ThermalTrak™»
  • радиоэлектоника
  • BoBka777's блог
  • МиУЗР - Модернизация и Усовершенствование Звуковой Радиотехники .
  • aleksey9900's блог
  • Лабораторная блок питания
  • Нашел статью о пайке проводов к светодиодов
  • Китайский городовой
  • Костик0's блог
  • УФ лампа для маникюра SK-818
  • 8 Contrasts Between Web Servers and Application Servers
  • Конденсатор
  • Новости, обзоры и другая полезная информация от ИМ "Радиодар"
  • Цветомузыка
  • OPeX3's блог
  • Sem2012's блог
  • это не хлам – это часть моей жизни
  • Контроллер на базе ПК (OS Win LTSC)
  • OdiS' блог
  • Хитрости строителя
  • aleksfil's блог
  • Color Preamp - предусилитель на лампах 12AU7
  • Проблема с зарядкой литиевого аккумулятора для шуруповерта 21 вольт
  • EmmGold's блог; AVR
  • Микроэлектроника
  • З
  • CH32V
  • Блог Плотникова Ильи
  • Бесплатные радиодетали с Алиэкспресс
  • Повышение качества и снижение временных затрат при испытаниях электронных компонентов с помощью отечественного испытательного оборудования
  • Источники питания MEAN WELL
  • Жизнь и рыбалка
  • yureika's блог
  • Глушитель спутникогого интернета
  • Всякая всячина
  • Для начинающих
  • Ignite your senses with the grace and allure of female escorts near Laguna Niguel
  • Fumitox's блог
  • Наш-RXT6 топ-10 на январь 2023: Лучшие сайты онлайн казино в России
  • Лицензионные казино онлайн в 2024 году на реальные деньги
  • Самоделки блог
  • Домашняя автоматика
  • Интересное и полезное
  • Ремонт Амфитон 35у-101с
  • ульян's блог
  • Свет в грузовой газели
  • Блок питания 0-12В для начинающих
  • Список лучших онлайн казино (RU+KZ) по играм на реальные деньги: Легальные сайты России по рейтингу 2024
  • Dimko's блог
  • Иван Самец's блог
  • SolomonVR's блог
  • gendzz's блог
  • fleh138's блог
  • Электроника forever!
  • aleksejhozhenets' блог
  • aleksejhozhenets' блог
  • diserver блог
  • aleksey290476 блог
  • ВАРГ's блог
  • Люстра Чижевского
  • wanes101's блог
  • voldemar2009's блог
  • Jana's блог
  • Jana's блог
  • Рена Искужин's блог
  • abduraxman7's блог
  • Kuzumba's блог
  • Самопальник
  • заработок через интернет на запчасти!!!
  • electric.kiev's блог
  • lolo's блог
  • leravalera's блог
  • ideomatic's блог
  • приглашаем на работу инженера-радиоэлектронщика
  • FREEMAN_77's блог
  • Блог автоэлектрика
  • Блог начинающего электронщика
  • Dersu's блог
  • Электроэнергия и её экономия!
  • Электроэнергия и её экономия!
  • Семён Ковалёв's блог
  • piligrim-666's блог
  • помогите с партотивной калонкой
  • помогите с партотивной калонкой
  • Музыка в стене.
  • m-a-r-i-k-a's блог
  • cosmos44's блог
  • oyama14's блог
  • блог Виталика!
  • ciornii's блог
  • Великий и Ужастный блог
  • Denis__Ricov's блог
  • Universal12's блог
  • Sprut's блог
  • Alexeyslav's блог
  • cosmosemo's блог
  • Заметки радиолюбителя
  • Falconist. Мемуары
  • Блог MillyVolt
  • усилитель импульсов
  • Panasonic sa-ak 18
  • Простое радиоуправление из того, что было.
  • 35house
  • Блог Радиочайника
  • Блохи iiiytnik'a
  • Хороший сервис- Бяка
  • Аудиолаборатория "Философия Звука"
  • ОколоCADовое
  • Блог KVLADS
  • Короп блог
  • Автоматизация котла Protherm MTV
  • Бложиг Касянича
  • Обо всём
  • Эксперимент
  • No electronics
  • ПРИРОДА СВЕТА и ЕГО ВОЗМОЖНОСТИ
  • Генератор на xr2206
  • HTPOWLASER
  • Когда-то были очень популярны у радиолюбителей
  • AVR - микроконтроллеры
  • Микроконтроллер
  • Самодельный автосимулятор
  • Интернет-магазин керамической плитки «Боярская Плитка»
  • Разработка электронных метрических мишеней IPSC для мягкой пневматики (страйкбол)
  • ,

Поиск результатов в...

Поиск контента, содержащего...


Дата создания

  • Начало

    Конец


Дата обновления

  • Начало

    Конец


Фильтр по количеству...

Регистрация

  • Начало

    Конец


Группа


Skype


ICQ


Интересы


Город


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


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

  1. Здравствуйте товарищи! На дмплом хочу заюзать приемники и передатчики 433МГц, которые любят Ардуинщики)) Я их переразведу на свою печать и схему восстановлю с реальной печати,но нужно указать в схеме какаие микры там работают. Кто-нибудь натыкался на схемы или может кто уже нашел состав модулей?
  2. Появилась необходимость собрать устройство на базе Arduino, которое работает с SD картой. Так как работа от аккумулятора, нужно максимально снизить ток потребления. Возникла проблема, если отключить питание SD карты, чтобы уйти в сон, после его возобновления работа с картой уже невозможна, при попытке пере инициализировать все виснет. Вопрос, как лучше реализовать отключение SD карты?
  3. И так имею экран от телефона Samsung SGH-C230 и хочу его подключить к Arduino UNO и чтобы работал, мне нужна схема подключения и прошивка (прошивка должна быть на родном языке Arduino IDE, так как других я не знаю)? Пожалуйста помогите, фотки экрана будут ниже.
  4. Добрый день! Столкнулся с такой проблемой, пытаюсь взаимодействовать с чипом 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 вольтам. В общем, могли ли мои неразумные операции вывести его из строя??? Еще в даташите указано, что неиспользуемые каналы надо подключить либо к питанию, либо к земле. Это может влиять на то, что я сейчас получаю?
  5. Заранее извиняюсь если вопрос для многих будет примитивным, но так как в радиотехнике 0 - прошу помощи. Итак: есть Arduino mini, различные датчики, датчик MQ135(потребление ~150mA). Питание: к пинам +5,Gnd припаян Microusb для подключения зарядника от телефона (но также хочу дать возможность запитать от 3 батареек). вопрос: 1. как сделать обвязку чтобы при подключении внешнего источника питания, питание от батареек не тратилось? 2. MQ135 пишут везде нужно свое питание но если я запитаю от внешнего источника его и ардуино то никаких проблем не возникнет? 3. надо датчик MQ135 включать периодически допустим раз в 10мин на 2 мин c помощю ардуино, какие элементы могут помочь в этом?(использовать реле мне кажеться как с ружья по воробьям)
  6. Эта статья является логическим продолжением вот этой статьи про монохромный 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
  7. Привет всем. первый раз держу ардуинку. Поставили такую задачу: На руки дали 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... и так далее пока не закончатся все выходы. Теперь вопрос от человека первый раз державшего на руках вышеописанный девайс: Как это нарисовать в скетче? БлагоДарю!
  8. Здравствуйте! Собрал приложенную схему, подключил к arduino uno. Ожидал я получить громкость окружающей среды, но получилось как-то не очень. Значения на аналоговом входе в тишине пляшут от 310 до 380. Если дуть в микрофон, то разброс значений от 0 до 555. На музыку или голос почти не реагирует. Что я делаю или понимаю не так? Спасибо.
  9. Всем привет. Недавно я задался вопросом изготовления коммутатора sim карт. Готовые решения есть на рынке, но мне забавы ради тратить пару сотен убитых енотов откровенно говоря не охота. Решил сделать POC своими руками. Идея простая - сим карты подключены к модему и в нужный момент ардуинка переключает с одной сим карты на другую. Для этих целей я использую твердотельный реле, которые и переключают физически контакты с одной сим карты на другую. И теперь вопрос знатокам: можно ли как-то упростить схему, исключив громоздкие ssr, и задействовав например транзисторы?
  10. Интересна тематика связанная с "умный дом" или rfid
  11. В общем ребят тема такая. Хотелось бы сделать многополосный анализатор спектра на ленте WS2812B + arduino Было забугорное видео с инструкцией но его удалили. Осталась только картинка и скетч от готового анализатора. Из за недостатка знаний сам построить не могу. Поэтому прошу более прошареных умов. Этого видео больше нет. Но выглядел анализатор именно так. Code Repository: https://www.dropbox.com/sh/g3qraziuimksdho/AADwkqKRP3JmV9tQyGD_z2jga?dl=0 Строго не судите. Это моё первое обращение на форуме. Посоветуйте как реализовать этот проект #define PIXELS 600 // Number of pixels in the string // These values depend on which pin your string is connected to and what board you are using // More info on how to find these at http://www.arduino.cc/en/Reference/PortManipulation #define PIXEL_PORT PORTD // Port of the pin the pixels are connected to #define PIXEL_DDR DDRD // Port of the pin the pixels are connected to #define PIXEL_BIT 6 // Bit of the pin the pixels are connected to #define NUM_COLS 30 // Number of columns in our neopixel matrix #define NUM_ROWS 20 // Number of rows in our neopixel matrix // These are the timing constraints taken mostly from the WS2812 datasheets // These are chosen to be conservative and avoid problems rather than for maximum throughput #define T1H 900 // Width of a 1 bit in ns #define T1L 600 // Width of a 1 bit in ns #define T0H 400 // Width of a 0 bit in ns #define T0L 900 // Width of a 0 bit in ns #define RES 6000 // Width of the low gap between bits to cause a frame to latch // Here are some convience defines for using nanoseconds specs to generate actual CPU delays #define NS_PER_SEC (1000000000L) // Note that this has to be SIGNED since we want to be able to check for negative values of derivatives #define CYCLES_PER_SEC (F_CPU) #define NS_PER_CYCLE ( NS_PER_SEC / CYCLES_PER_SEC ) #define NS_TO_CYCLES(n) ( (n) / NS_PER_CYCLE ) // My spectrum analyzer produces a rainbow effect as amplitudes increase // This is a lookup table of sorts for the appropriate color of a specific amplitude (RGB) // I found the values online in RGB format so I left them that way and corrected for it later... uint8_t Rainbow[60] = {0xbf, 0x00, 0xff, 0x7f, 0x00, 0xff, 0x40, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x40, 0xff, 0x00, 0x7f, 0xff, 0x00, 0xbf, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xbf, 0x00, 0xff, 0x80, 0x00, 0xff, 0x40, 0x00, 0xff, 0x00, 0x40, 0xff, 0x00, 0x80, 0xff, 0x00, 0xbf, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xbf, 0x00, 0xff, 0x80, 0x00, 0xff, 0x40, 0x00, 0xff, 0x00, 0x00}; // Actually send a bit to the string. We must to drop to asm to enusre that the complier does // not reorder things and make it so the delay happens in the wrong place. void sendBit( bool bitVal ) { if ( bitVal ) { // 0 bit asm volatile ( "sbi %[port], %[bit] \n\t" // Set the output bit ".rept %[onCycles] \n\t" // Execute NOPs to delay exactly the specified number of cycles "nop \n\t" ".endr \n\t" "cbi %[port], %[bit] \n\t" // Clear the output bit ".rept %[offCycles] \n\t" // Execute NOPs to delay exactly the specified number of cycles "nop \n\t" ".endr \n\t" :: [port] "I" (_SFR_IO_ADDR(PIXEL_PORT)), [bit] "I" (PIXEL_BIT), [onCycles] "I" (NS_TO_CYCLES(T1H) - 2), // 1-bit width less overhead for the actual bit setting, note that this delay could be longer and everything would still work [offCycles] "I" (NS_TO_CYCLES(T1L) - 2) // Minimum interbit delay. Note that we probably don't need this at all since the loop overhead will be enough, but here for correctness ); } else { // 1 bit // ************************************************************************** // This line is really the only tight goldilocks timing in the whole program! // ************************************************************************** asm volatile ( "sbi %[port], %[bit] \n\t" // Set the output bit ".rept %[onCycles] \n\t" // Now timing actually matters. The 0-bit must be long enough to be detected but not too long or it will be a 1-bit "nop \n\t" // Execute NOPs to delay exactly the specified number of cycles ".endr \n\t" "cbi %[port], %[bit] \n\t" // Clear the output bit ".rept %[offCycles] \n\t" // Execute NOPs to delay exactly the specified number of cycles "nop \n\t" ".endr \n\t" :: [port] "I" (_SFR_IO_ADDR(PIXEL_PORT)), [bit] "I" (PIXEL_BIT), [onCycles] "I" (NS_TO_CYCLES(T0H) - 2), [offCycles] "I" (NS_TO_CYCLES(T0L) - 2) ); } // Note that the inter-bit gap can be as long as you want as long as it doesn't exceed the 5us reset timeout (which is A long time) // Here I have been generous and not tried to squeeze the gap tight but instead erred on the side of lots of extra time. // This has thenice side effect of avoid glitches on very long strings becuase } void sendByte( uint8_t sByte ) { for( unsigned char bit = 0 ; bit < 8 ; bit++ ) { sendBit( bitRead( sByte , 7 ) ); // Neopixel wants bit in highest-to-lowest order // so send highest bit (bit #7 in an 8-bit byte since they start at 0) sByte <<= 1; // and then shift left so bit 6 moves into 7, 5 moves into 6, etc } } /* The following three functions are the public API: ledSetup() - set up the pin that is connected to the string. Call once at the begining of the program. setBrightness(byte) - changes the brightness of the neopixels (0(low)->255(high)) setMatrix(*byte, byte[]) - Converts a byte array of amplitudes into appropriate pixel orientation for matrix clear() - writes 0's to all pixels to clear the matrix show(*byte) - push updated pixel data to the matrix */ /************ledSetup()******************/ /// Description: declare which i/o pin will be sending data /// * Must be called prior to using neopixels /// Parameters: NONE /// Return: NONE /****************************************/ void ledSetup() { bitSet( PIXEL_DDR , PIXEL_BIT ); } /************setBrightness()******************/ /// Description: changes brightness of neopixels /// * If not called, defaults to 255 /// Parameters: value - value between 0-255 to signify fraction of 100% brightness /// Return: NONE /*********************************************/ uint8_t Brightness = 255; void setBrightness(uint8_t value) { Brightness = value; return; } /************setMatrix()******************/ /// Description: Takes a NUM_COLS-long byte-array consisting of /// amplitudes for each column of the matrix, and /// populates the pixels array accordingly /// Parameters: Bars - byte array of new amplitudes /// pixels - byte array that will hold data for each pixel /// Return: NONE /*****************************************/ void setMatrix(uint8_t * Bars, uint8_t pixels[]) { uint16_t k = 0; // Scan column by column populating each pixel row by row for(int i = 0; i < NUM_COLS; i++) { for(int j = 0; j < NUM_ROWS; j++) { // For even valued columns, scan from bottom to top of column if(j <= (uint8_t)Bars[i]) { // If the row we are looking at is less than the amplitude in question pixels[k++] = Rainbow[j*3+1]; // then the neopixel should be active with the color found in the color lookup table above pixels[k++] = Rainbow[j*3]; // ******* Make sure that your values are in GRB format!!!! ******** pixels[k++] = Rainbow[j*3+2]; } else { // If the current row is greater than the amplitude in question pixels[k++] = 0; // leave the pixel blank pixels[k++] = 0; pixels[k++] = 0; } } i++; // Each loop will actually examine 2 columns rather than just one... for(int j = NUM_ROWS-1; j >= 0; j--) {// because odd valued columns were wired upside-down for convenience if(j <= (uint8_t)Bars[i]) { // So rather than scanning bottom to top, scan top to bottom now pixels[k++] = Rainbow[j*3+1]; // since the pixels array will be fed into the neopixels serially pixels[k++] = Rainbow[j*3]; // you'll need this column to be placed backwards in the array... pixels[k++] = Rainbow[j*3+2]; } else { pixels[k++] = 0; pixels[k++] = 0; pixels[k++] = 0; } } } return; } /************Clear()*********************/ /// Description: Send all 0s to the matrix /// Parameters: NONE /// Return: NONE /****************************************/ void Clear() { cli(); // Turn off all interrupts while we send data to the matrix for(int i = 0; i < PIXELS; i++) { sendByte(0); sendByte(0); sendByte(0); } sei(); // All of the data is sent so we can turn back on interrupts // By sending creating a specifically timed delay, the neopixels will know that we are done sending data _delay_us( (RES / 1000UL) + 1); // Round up since the delay must be _at_least_ this long (too short might not work, too long not a problem) } // Just wait long enough without sending any bits to cause the pixels to latch and display the last sent frame /************show()******************/ /// Description: "Refresh" the neopixel matrix with /// updated values /// * Should be called once the pixel array /// is updated and ready to be pushed /// Parameters: pixels - the byte array containing values for all the pixels /// Return: NONE /************************************/ void show(uint8_t * pixels) { cli(); // Turn off all interrupts while we send new data for(int i = 0; i < PIXELS*3; i++) { if(pixels[i] != 0 && Brightness != 0) { sendByte(((Brightness * pixels[i]) >> 8) + 1); // This is when we take pixel brightness into account } else { sendByte(0); } } sei(); // All data is sent so we can turn interrupts back on // By sending creating a specifically timed delay, the neopixels will know that we are done sending data _delay_us( (RES / 1000UL) + 1); // Round up since the delay must be _at_least_ this long (too short might not work, too long not a problem) return; }
  12. Здравствуйте. Решил собрать дозиметр на микроконтроллере. Решил соединить сразу 4 счётчика. Нашел в Интернете две схемы с разным соединением. Прошу совета. Может кто уже этим занимался. Какая схема лучше?
  13. Необходимо измерять переменный ток 400 А, при включении в переходных процессах ожидается ток до 600 А а измерения слать по Wifi на сервер. Для это задачи хочу использовать макетную плату WEMOS d1 mini pro (https://wiki.wemos.cc/products:d1:d1_mini_pro) и токовые клещи MASTECH MS3302 (с коэффициентом 10мВ/А). Хочу поднять напряжение на выходе датчика до переменки 0-12 В, а затем через делительный мост подключить на аналоговый вход WEMOS (у него на входе должно быть 0-3,3 В). Вопрос будет ли пригодна данная схема? P.S. Возможности использовать другие клещи и другую макетную плату нет. и на схеме ошибка там в мосту не Омы, а кОмы
  14. Можно ли залить в arduino прошивку, предназначенную для чистого AVR?
  15. Добрый день Имеется мощный симистор ТС (вроде ТС122-25, на 40 А). С помощью него предполагается управлять мощным ТЭНом. В качестве регулятора будет Ардуина. Т.к. симистор коммутируется хорошим током и напряжением 220 В, то использую промежуточное звено - твердотельное реле на 2 А (вот такое: http://wiki.iarduino.ru/page/tverdotelnoe-rele-trema-modul/). Для предварительной проверки собрал простую схему, в которой управляю лампой накаливания. Скважность ШИМ формируется в зависимости от положения подключенного потенциометра. Собрал, запрограммировал. Все работает, но лампа офигенно мерцает (не мерцает только при нуле и при максимуме, что ожидаемо). Вот так примерно все это выглядит на видео: https://yadi.sk/i/6yF2iGSb3Lb66c) ШИМ Ардуины работает на 500 Гц. Вопросы: 1) Как я понимаю, проблема в том, что симистор открывается в нуле, а ШИМ сигнал не синхронизирован с переходом через ноль. Из-за этого выпадает часть импульсов. Есть ли какое-то простое решение этого вопроса в рамках существующей схемы? 2) Правильно ли я понимаю, что такое "мерцание" при управлении ТЭНом совершенно безвредно для ТЭНа и продолжительности его жизни? 3) Может ли быть проблема в том, что твердотельное реле не справляется с частотой или проблема полностью относится к п.1? Заранее спасибо!
  16. Продаются: -Паяльная станция lukey 852D+ Состояние хорошее, использовалась редко, не вскрывалась. Цена - 4500 -Отладочная плата STM32F429I-DISCO Цена - 2500 -Программатор AVR STK500 Цена - 1000 -Ультразвуковые дальномеры HC-SR04 Имеется 10 штук Цена - 80 за штуку, 5 штук за 350, 10 штук за 600 -Зарядное утройство ICharger 106В + Цена - 5500 -Блок питания DC12V 250 Вт Подойдет для ICharger 106В + Цена - 1000 -Плата для подключения по Bluetooth HC-05 Цена - 300 -Сервопривод MG90S Имеется 2 штуки Цена - 150 Все цены в рублях. Местонахождение - Воронеж. Почта за ваш счет.
  17. Пытаюсь симулировать нажатия на экран телефона с помощью Arduino и монетки. Подтягиваю на землю, экран срабатывает на нажатие, но удерживает нажатие даже если отключить провод от земли. Только если провод убрать с монетки, то срабатывает нажатие. Подскажите, в чем может быть проблема и как ее решить?
  18. Доброго времени суток всем, господа и дамы! В разделе схем нашёл статью о создании гитарного тюнера на базе ардуино. Поискал по интернетам, все аналогичные поделки ссылаются на одну и ту же статью, посему пришёл к выводу, что и свою буду делать по тому же принципу. С точки зрения программной части вопросов никаких ,я в упор не понимаю принцип работы предусилителя, что стоит перед ардуиной. Вот схема 1, что я искренне не понимаю, зачем две батарейки по 9 вольт, ведь TL082 в теории и от одной запустится корректно 2. Можно ли как-то переделать данную схему на работу от одной батарейки? Я не смог понять принципа работы схемы, так как плохо читаю принципиальные схемы, подумал, что если попробую развести печатку, смогу лучше понять логику, что куда идёт и с чём его есть, результат приложен... Дальше я просто не понял, а каким образом вообще питается ардуинка? Почему её питание зависимо от сигнала, который в теории идёт на вход для анализа? Неужели её нельзя просто самостоятельно запитать? Очень прошу помощи в понимании принципов работы этой штуковины.
  19. Как устаканить значения переменного резистора, когда он начинает скакать от 550 до 600 сам?
  20. Здравствуйте, имеется устройство на Atmega328p. Запитано от двух батареек АА (максимум 3,2 В, минимум 1,9 В). 95% времени устройство спит и потребляет ток 2 мкА. Требуется раз в день измерять напряжение питание. В качестве опорного напряжения АЦП выступает внутреннее напряжение 1,1 В. При использовании делителя напряжения он потребляет 21 мкА, что очень много. Пробовал с транзистором, но ток тоже очень высокий (1,2 мкА). Как сделать так, что бы отключать этот делитель и он не потреблял ток?
  21. Интересуюсь есть ли альтернативы шилдам NRF24L01 и MX-05V/MX-FS-03V для RF обмена? Насколько я понял, NRF24L01 работает по пайпам/каналам, только одна пара может общаться одновременно. Что не подходит: если устройств много, третье устройство никак не может узнать, что два других в это время общаются и может "влезть" в чужой разговор. В MX-05V/MX-FS-03V , как я понял, для организации приема потребуется постоянное программное прослушивание, в принципе это вариант, но хотелось бы узнать нет ли еще вариантов такого рода.
  22. Хочу создать некое устройство на ардуино pro mini, работающее 24/7 и интересует вопрос надежности. Известны ли данные насчет того, как часто этот контроллер может повисать по программным и аппаратным причинам? Подумалось, а почему бы не поставить рядом простой примитивный таймер, который бы сбрасывал его, например, каждые 5 минут (если это не влияет на основную функциональность разработки или есть возможность это координировать)?
  23. Возможно ли построить на ардуино уно или мега несложный и дешёвый квадрокоптер? Желательно управление через вайфай и с ноутбука (смартфона). или с дешёвого пульта радиоуправления на 6 каналов? Нигде в интернете достаточно понятной и легкодоступной информации не нашёл. Заранее спасибо.
  24. Всем добрый вечер! Прошу помощи в странном деле. Присутствует бутерброд - Arduino Nano + Ethernet шилд в который вставляется нано. К пинам подключены твердотельные реле ssr-25DA - 5 штук. Их характеристики: Input voltage: 3-32VDC Output voltage: 24-380VAC Output current: 25A Working voltage: 250V On voltage: ≤1V One-off Time: ≤10ms Off leakage Current: ≤2mA Реле соединено по схеме: В интернете у всех работает. Питание ардуины при этом было 500 мА. Ethernet шилд не был подключен к сети. Был написан код который выставляет HIGH на 2,3,4,5,6 пине и через 5 секунд в LOW. Все работало минут 10, потом смотрю одно реле работает, а остальные нет. Вынял ардуину, а она не шьется. Я нагрузил каждый из пинов и вывел из строя ардуину?
  25. Всем добрый вечер! Прошу помощи в странном деле. Присутствует бутерброд - Arduino Nano + Ethernet шилд в который вставляется нано. К пинам подключены твердотельные реле ssr-25DA - 5 штук. Их характеристики: Input voltage: 3-32VDC Output voltage: 24-380VAC Output current: 25A Working voltage: 250V On voltage: ≤1V One-off Time: ≤10ms Off leakage Current: ≤2mA Реле соединено по схеме: В интернете у всех работает. Питание ардуины при этом было 500 мА. Ethernet шилд не был подключен к сети. Был написан код который выставляет HIGH на 2,3,4,5,6 пине и через 5 секунд в LOW. Все работало минут 10, потом смотрю одно реле работает, а остальные нет. Вынял ардуину, а она не шьется. Я нагрузил по ~25 мА на каждый из пинов и вывел из строя ардуину, и надо было резистор ~1кОм последовательно включать?
×
×
  • Создать...