Борьба с bluetooth модулями HC-05 и HC-06 + Arduino
Много букв, постарался чуток с юмором. Записки начинающего ардуинщика.
Понадобилось мне для одной самоделки с arduino прикрутить bluetooth. Погуглив, выбор пал на модули bluetooth HC-06. Купил, успешно прикрутил, но захотелось мне сменить имя и пароль. В общем то в гугле валом инфы по этому поводу. Да не тут то было. На youtube и в блогах у людей все прекрасно, меняют имена и пароли, смотрят версию, меняют скорость, а на деле не работает!
Не воспринимает AT команды ни HC-05 и HC-06 через ардуину.
Сначала я купил HC-06, потом купил HC-05, перепробовал многое, описанное в статьях.
В итоге понял что мои китайские ардуинки не работают правильно, а именно RX и TX не передается.
Это можно понять замкнув их на ардуине и попробовать в мониторе порта отослать что угодно, при замкнутых RX и TX отосланное вернется. А вот у меня не вернулось. (Должен быть залит пустой скетч в ардуинку)
В статьях и на форумах народ мучился вопросом почему через аруинку нельзя сменить пароль и название bluetooth модуля. Да и вообще AT команды не работают. Одни ставили крест на CH340G мол он плохой и надо что то другое итд.
Многие выходили из положения покупая отдельно модуль USB- UART на другой микросхе которую они хвалили, и у них все получалось, другие писали мост с сериал порта на цифровые выходы, пробовал, но не работало.
Может получилось бы и у меня с модулем, но я купил не тот модуль!) А это и к лучшему, потому что я раскопал почему не работает RX и TX в китайских Arduino.
В моем древнем компе есть физический COM порт, и я решил шить через него, и купил переходник с преобразователем уровней MAX3232, а не UART!
Ну с arduino я недавно, и про UART я знал мало, да и сейчас еще не знаю всего)
Я еще тот динозавр который помнит AT команды диалаповских модемов.
Я не понимал, почему в терминале (отдельная программа) на мои AT - команды возвращается кириллица, в виде букв - "я" "яя " итд
"яя дас ист фантастиш" подумал я, мне модуль стал отвечать! Я очень обрадовался что он жив! Да, но почему на "немецком" и в кириллице он отвечает?)) .. или [00] [01] итд. В общем ответы были, да не те, да потому что это не UART! это я понял позже.
Ехать еще раз на другой конец города за правильным модулем USB- UART я не хотел.
Начал гуглить глубже, почему не работает RX и TX в ардуине? и нашел!
Один разработчик в своей самоделке докопался почему нет ответа через ардуинку, оказалось китайцы мать их, запаяли резисторы большего номинала, по 1кОм. Если заменить их на 220 Ом, все начинает прекрасно работать! Фото прилагаются. Это Arduino Uno (китайская копия)
Необходимо заменить резисторы R8 и R9 на 220 Ом.
А это мои запаянные резисторы на 220 Ом, правда не смд но у меня Uno в пластиковой коробке, и деформация с замыканием исключены.
Вот где эти резисторы на Arduino Nano многие на форумах как раз мучаются с этой версией ардуинки.
В итоге я прошил HC-05 и HC-06, правда AT команды для них немного различаются, но это все легко гуглится.
Надеюсь что эта информация поможет кому-то сэкономить время и нервы.
Всем удачи.
Качалка для малыша на ардуино
Всем здравствуйте! Недавно сломалась детская автоматическая качелька (сгорела плата) и я решил заменить ее на Ардуино нано. Прикупил платки: члюч на мосфете для управлением моторчиком, Акселерометр-гироскоп на базе mpu9250. Немного об устройстве: раскачивалие люльки осуществляется моторчиком на 12в через редуктор (установленны в блоке управления где вентилятор). Раскачивает люльку моторчик только в одну сторону, в обратную сторону отклоняется по инерции. Я прикрепил mpu9250 к днищу люльки, а ардуино и все остальные потроха запихал в корпус блока управления. При написании скетча столкнулся с проблемой: при подаче на регулятор 12 вольт качалка раскачивается и ардуино зависает, а при подаче на регулятор 6 вольт качалка качается минуты 3-4 и тоже зависает.
скетч
#include <Wire.h>
#include <TimerOne.h>
#define MPU9250_ADDRESS 0x68
#define GYRO_FULL_SCALE_250_DPS 0x00
#define GYRO_FULL_SCALE_500_DPS 0x08
#define GYRO_FULL_SCALE_1000_DPS 0x10
#define GYRO_FULL_SCALE_2000_DPS 0x18
#define ACC_FULL_SCALE_2_G 0x00
#define ACC_FULL_SCALE_4_G 0x08
#define ACC_FULL_SCALE_8_G 0x10
#define ACC_FULL_SCALE_16_G 0x18
#define relay_pin 8 // пин мосфета / реле
int flagMosphet = 0;
// This function read Nbytes bytes from I2C device at address Address.
// Put read bytes starting at register Register in the Data array.
void I2Cread(uint8_t Address, uint8_t Register, uint8_t Nbytes, uint8_t* Data)
{
// Set register address
Wire.beginTransmission(Address);
Wire.write(Register);
Wire.endTransmission();
// Read Nbytes
Wire.requestFrom(Address, Nbytes);
uint8_t index=0;
while (Wire.available())
Data[index++]=Wire.read();
}
// Write a byte (Data) in device (Address) at register (Register)
void I2CwriteByte(uint8_t Address, uint8_t Register, uint8_t Data)
{
// Set register address
Wire.beginTransmission(Address);
Wire.write(Register);
Wire.write(Data);
Wire.endTransmission();
}
// Initial time
long int ti;
volatile bool intFlag=false;
// Initializations
void setup()
{
pinMode(relay_pin, OUTPUT);
// Arduino initializations
Wire.begin();
Serial.begin(115200);
// Set accelerometers low pass filter at 5Hz
I2CwriteByte(MPU9250_ADDRESS,29,0x06);
// Set gyroscope low pass filter at 5Hz
I2CwriteByte(MPU9250_ADDRESS,26,0x06);
// Configure accelerometers range
I2CwriteByte(MPU9250_ADDRESS,28,ACC_FULL_SCALE_4_G);
// Configure gyroscope range
I2CwriteByte(MPU9250_ADDRESS,27,GYRO_FULL_SCALE_1000_DPS);
pinMode(13, OUTPUT);
Timer1.initialize(20000); // initialize timer1, and set a 1/2 second period
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
// Store initial time
ti=millis();
}
// Counter
long int cpt=0;
void callback()
{
intFlag=true;
digitalWrite(13, digitalRead(13) ^ 1);
}
// Main loop, read and display data
void loop()
{
while (!intFlag);
intFlag=false;
// _______________
// ::: Counter :::
// Display data counter
// Serial.print (cpt++,DEC);
// Serial.print ("t");
// ____________________________________
// ::: accelerometer and gyroscope :::
// Read accelerometer and gyroscope
uint8_t Buf[14];
I2Cread(MPU9250_ADDRESS,0x3B,14,Buf);
// Create 16 bits values from 8 bits data
// Accelerometer
int16_t ay=-(Buf[2]<<8 | Buf[3]);
// Gyroscope
int16_t gx=-(Buf[8]<<8 | Buf[9]);
// Display values
// Gyroscope
if(gx>=0){
flagMosphet = 1;
}
else if(gx<-30 || ay<-100){
flagMosphet = 0;
}
digitalWrite(relay_pin, flagMosphet);
}
ссылка на библеотеку TimerOne.h
ардуино просто подает на мосфет сигнал 1 и останавливается оставляя моторчик под нагрузкой.
ARDUINO часики с динамической индикацией
Как то так сложилось, что для ардуинки практически не используют большие 7-ми сегментные индикаторы, все больше уже готовые модули, которые не отличаются крупными размерами.
Сей пробел по мере сил я немного осветил ;)
Схема часов предельно простая - 4-х разрядный 7-ми сегментный дисплей, собранный на суперярких 1,5" дюймовых индикаторах с общим анодом FYS-15011BD-11. В каждом сегменте индикатора стоят по 2 последовательных светодиода.
Аноды идут соответственно на выводы А2-А5 (в скетче они зовутся 16-19), катоды через резисторы 220 Ом. Ток получается мизерный, а яркость в вечернее время даже чрезмерной.
Я сначала на точку поставил тоже 220 Ом, но она светится значительно ярче, потому надо поэкспериментировать с большим номиналом, в схеме уже стоит 470 Ом.
Катоды идут с D2 до D9 - шесть выводом относятся к PORTD и два к PORTB. Скорее всего можно задействовать весть PORTD на вывод, включая 0 и 1 выводы, на плате обозначаются как выводы последовательного порта, индикатор по идее мешать прошивке не будет. Но я тестировал программу с выводом в последовательный порт, поэтому не задействовал их.
В качестве часов реального времени выбрана DS1302 (впрочем я собираюсь все возможные протестировать). На схеме видно что куда подключать.
Для начальной установки точного времени нужно найти и раскомментировать в коде строчку :
// rtc.setTime(12, 00, 0); // Set the time to 12:00:00 (24hr format)
Естественно поставив нужные значения времени в формате часы : минуты : секунды, после первого запуска опять нужно убрать строку под комментарий и еще раз загрузить скетч. В противном случае время будет при каждом включении часов начинать отсчет с выбранного времени.
Код с использованной библиотекой реального времени https://yadi.sk/d/PirwXVqzB-1nRw
Вот так оно выглядит вживую.
Нули выводятся потому что нашел серьезный баг - беспаечные платы могут из-за плохого контакта дать трудноуловимую ошибку, в данном случае периодически то часы шли, то вот так показывали нули. Оказалось все дело в контактах ног ардуинки в части подключения часовой микросхемы.
А вот такой корпус будет у этих часиком, корпус от советских электромеханических часов Слава, ну точнее не сам корпус, а декоративные элементы.
PS: Только сейчас вспомнил что бывают переходы на летнее/зимнее время и таки придется в следующей версии ставить кнопки для выставления часов. 😉
Сбыча мечт! Доска для игры в нарды DIY
Товарищи! Используя идеологически верные компоненты из близкого нам по духу коммунистического Китая, отдельно взятый рабочий в моем лице осуществил свою давнюю мечту! А именно-тематические нарды.
А если серьезно, то благодаря лазерному граверу(собранному не без помощи пикабу) и своим не совсем кривым рукам и даже не смотря на отсутствие специфического инструмента для деревообработки была собрана эта доска. Доска получилась кривоватой из-за сырой фанеры(повело после просушки) , но радует мои глаза и так. Осталось вскрыть лаком.
Следующая задумка думаю будет тематически связанна с Терминаторами. На фото видны косяки в выжигании- это мои шишки и мой опыт. Понятно стало, что мне нужна мастерская, в квартире невозможно нормально ничего делать с деревом, просто беда. Жаль. Мне очень понравился этот материал. Но нужны еще какие нибудь инструменты кроме концелярского ножа, дрели и наждачки. Нужны струбцины, фрезер по дереву, набор рашпилей, верстак, рубанок, хороший свет, хорошая металлическая линейка, большой металлический угольник и помещение. И вытяжка для гравера. Провоняло пол квартиры горелой сосной. Также пришлось в авральном режиме осваивать фотожоп, спасибо ютубу и иже с ним.
Знаете, во время работы с этим проектом, мелькнула мысль, а тем ли я занят в этой жизни? Правильной ли дорогой иду? Может ЭТО, то что мне нужно?
Вот фото самого гравера. Он еще не "расчесан" до конца. И это тоже интересно.
Плата трассирована и изготовлена самостоятельно.
И да. Это мой первый пост на пикабу!
Всем вдохновения!
Р. S. Хотелось бы рассказать о том, как собирал гравер, испытывал, о первой сожженной лазерной голове, о на. балове от китайских "друзей", о том стоит ли собирать самому или купить, но это наверное навсегда останется со мной. Могу сказать, лишь, что ни о чем не жалею, не смотря на кучу потраченных средств. Это того стоило!
P. S. S. Юмористам с пикабу(тем, что в каждой бочке затычка), идите пожалуйста на нефритовый стержень.
Автодозатор удобрений. Часть 2
В моём предыдущем посте по автодозатору удобрений, было несколько комментариев с просьбой выложить схему пайки, а также скетч для ардуино.
Все используемые в проекты компоненты брал на алике. Оставлю здесь ссылки на продавцов, у которых я приобретал. Возможно вы найдете дешевле.
После того, как спаяли полученные с алика компоненты, закачиваете на свой компьютер ArduinoIDE и устанавливаете.
После этого скачиваем скетч с сайта AlexGyver, любо забираем с облака немного отредактированный скетч, где я закоментил пару лишних строк кода, чтобы на дисплее не отображалась лишняя информация. Планирую там-же выкладывать время от времени новые прошивки с исправлениями от AlexGyver и с комментированием лишнего кода. В любом случае вам нужно разархивировать скаченный архив, в архиве найти директорию libraries и скопировать содержимое в директорию, куда установлена ArduinoIDE. В директории GyverControl_ver находится сам скетч. Осталось в инструментах вырать тип платы: Arduino nano, процессор: Atmega 328 P(old bootloader), порт на котором определилась ваша ардуинки и нажать кнопку загрузить. Готово.
Тестирование в течении нескольких дней показало, что автодозатор работает стабильно
Состояние "0" означает, что реле разомкнуто, "1" -- перистальтический насос работает, "-" реле не включено в настройках.
Регулировка яркости светодиода с помощью потенциометра
скетч:#define led 9
#define pot A0
void setup()
{
// пин со светодиодом — выход
pinMode(led, OUTPUT);
// пин с потенциометром - вход
pinMode(pot, INPUT);
}
void loop()
{
// объявляем переменную x
int x;
// считываем напряжение с потенциометра:
// будет получено число от 0 до 1023
// делим его на 4, получится число в диапозоне
// 0-255 (дробная часть будет отброшена)
x = analogRead(pot) / 4;
// выдаём результат на светодиод
analogWrite(led, x);
}
Схема:
Сможете найти на картинке цифру среди букв?
Справились? Тогда попробуйте пройти нашу новую игру на внимательность. Приз — награда в профиль на Пикабу: https://pikabu.ru/link/-oD8sjtmAi