Делаем из cc2541, модуль hm-10

Возникла задача купить быстро в РФ hm-10, но с чеками.Быстро нашелся магазин http://arduinobazar.ru/ .Магазин конечно не порадовал ценами, но хоть модуль был в наличии.Модуль на фотографии оказался не hm-10, а модуль с чипом cc2541.Хотя данные модули построены на том же чипе.У них есть два существенных отличия.

1.Это наличие второго кварца.Данное отличие видно сразу.

sku_378853_3

На модулях cc2541 это два залуженных пятака.На них должен был быть припаян кварц на 32.768 кГц.Кварц smd.Подходят кварцы ABS07-32.768KHZ-9-T  и ABS07-32.768KHZ-7-T.В целом любой корпусом 9PF или ему близкий.Также  возможно отсутствие двух конденсаторов на 12-15 pF.Их тоже надо припаять.Для понимания вот схема от TI с двумя кварцами http://www.ti.com/lit/df/tidr489/tidr489.pdf

2.Не отвечает на AT команды.Действительно модуль может быть виден в сети bluetooth, и даже подключаться, но AT команды он не отвечает.Это проблема связана с тем что единственный производитель HM-10, а именно не произносимая компания JNHuaMao Technology Company.Прошивает их на заводе своей фирменной прошивкой, в которой реализована работа с AT командами.

Фото оригинального hm-10 с распиновкой

hm-10-pinout

Урок 24.Джойстик.Ода два

В прошлом уроке мы выводили данные о перемещении рукоятки джойстика в консоль.При положении джойстика в положении 90 градусов.В консоль выводились значения от 510 до 525.Это потому-что потенциометр находится в средних значениях.Мы постараемся решить это с помощью логики.Все значения джойстика условно можно поделить на два типа.Либо меньше около 500, либо больше.Поэтому в «монитор порта» мы будем выводить именно эти данные.Только слова.

Запрограммируем arduino следующим кодом:

const byte PIN_ANALOG_X = 0;
const byte PIN_ANALOG_Y = 1;

const int X_THRESHOLD_LOW = 505;
const int X_THRESHOLD_HIGH = 515;

const int Y_THRESHOLD_LOW = 500;
const int Y_THRESHOLD_HIGH = 510;

int x_position;
int y_position;

int x_direction;
int y_direction;

void setup() {
Serial.begin(9600);
}

void loop () {
x_direction = 0;
y_direction = 0;

x_position = analogRead(PIN_ANALOG_X);
y_position = analogRead(PIN_ANALOG_Y);

if (x_position > X_THRESHOLD_HIGH) {
x_direction = 1;
} else if (x_position < X_THRESHOLD_LOW) {
x_direction = -1;
}

if (y_position > Y_THRESHOLD_HIGH) {
y_direction = 1;
} else if (y_position < Y_THRESHOLD_LOW) {
y_direction = -1;
}

if (x_direction == -1) {
if (y_direction == -1) {
Serial.println(«left-down»);
} else if (y_direction == 0) {
Serial.println(«left»);
} else {
// y_direction == 1
Serial.println(«left-up»);
}
} else if (x_direction == 0) {
if (y_direction == -1) {
Serial.println(«down»);
} else if (y_direction == 0) {
Serial.println(«centered»);
} else {
// y_direction == 1
Serial.println(«up»);
}
} else {
// x_direction == 1
if (y_direction == -1) {
Serial.println(«right-down»);
} else if (y_direction == 0) {
Serial.println(«right»);
} else {
// y_direction == 1
Serial.println(«right-up»);
}
}
}

 

 

 

Урок 23.Джойстик

В этом уроке мы рассмотрим джойстик.Для начала соединим джойстик с платой по заданной схеме:

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

Запрограммируем arduino следующим кодом:

const byte PIN_ANALOG_X = 0;//ось х подключаем к а0
const byte PIN_ANALOG_Y = 1;//ось у подключаем к а1

void setup() {
Serial.begin(9600);//настраиваем порт
}

void loop() {

Serial.print(«x:»);//считываем
Serial.print(analogRead(PIN_ANALOG_X));//считываем
Serial.print(» «);//выводим

Serial.print(«y:»);//считываем
Serial.print(analogRead(PIN_ANALOG_Y));//считываем
Serial.print(» «);//выводим

Serial.println();
}

ble link или что за ble в xbee?

Если у вас уже есть arduino uno или mega, то с помощью xbee shield и ble-link вы сможете превратить свой контроллер в полноценную bluno плату.

Характеристики

Bluetooth чип: Т. CC2540
Частота: 2,4 ГГц
Скорость передачи: ≤1Mbps
Модуляция: GFSK, Bluetooth с низким энергопотреблением, V4.0
Потребляемая мощность: рабочий: 10.6mA среднем режиме готовности: 8.7mA
Чувствительность: -93dB
Входное напряжение: DC 3,3
Рабочая температура: -40 ℃ ~ + 85 ℃
Расстояние передачи: 15 ~ 20 м в помещении (30 м в свободном пространстве)
Размер: 32мм * 22мм
поддержка команд AT для отладки
поддерживать мастер-слейв режимы
поддержка «Bluetooth Remote» обновление программы Arduino (только поддерживать uno и Arduino mega)
Поддержка обновления программы через usb, BLE чипа
Поддержка Bluetooth HID
Поддержка Android и IOS приложений, с открытым исходным кодом, пригодные для вторичного развития пользователем

Распиновка

600px-BLE-Link_detail

BLE-LINK распиновка

Необходимые инструменты

BLE-Link
Android или IOS
Кабель Micro USB для питания

Попробуем настроить модуль

Необходимые инструменты

ble link x1
Android-устройство или IOS устройство x1
Кабель Micro USB

1.Запрограммируем arduino следующим кодом:

void setup() {
Serial.begin(115200); //Настраиваем порт
}

void loop() {
if (Serial.available()) {
Serial.write(Serial.read());//Читаем данные
Serial.println(); //И выводим данные в порт
}
}

2. Загрузите скетч.

Для Android
1.Скачайте: https://cloud.mail.ru/public/Ez28/VkQuLRnCy и установите приложение.

2. Запустите приложение.

3. Нажмите кнопку «Сканировать» и выберите устройство «bluno».

4. После подключения нажмите на кнопку «Отправить данные» , чтобы отправить сообщение в текстовом поле в Ble link.

5. Нажмите «отправить».

Для IOS
1. Cкачайте исходники приложения: https://cloud.mail.ru/public/GGg4/7Pv13foNz

2. Запустите приложение.

3. Нажмите кнопку «Поиск»  для поиска и выбора устройства.

4. После изменения состояния соединения с «Не готов!» в  «Ready!», нажмите кнопку «Отправить» , чтобы отправить сообщение в текстовом поле  в Ble link.

5. Обратите внимание, на то  что при соединении модуля будет постоянно гореть link.

Как залить прошивку через bluetooth на arduino?

Необходимые инструменты

BLE link x1
Кабель Micro USB x1

1.С помощью «монитора порта» arduino ide отправьте следующие команды

2. Поверните переключатель в режим  «AT» на модуле.

3. Отправьте следующие команды:

Input : AT+SETTING=DEFCENTRAL<CR+LF> Answer(Return):OK
Input : AT+BLUNODEBUG=OFF<CR+LF> Answer(Return):OK

5. Для периферийной, отправив следующую команду:

Input : AT+SETTING=DEFPERIPHERAL<CR+LF> Answer(Return):OK
Input : AT+BLUNODEBUG=OFF<CR+LF> Answer(Return):OK

6. «AT + BLUNODEBUG = ВЫКЛ» сделает беспроводной плату.

7. Поверните переключатель в режим  «NORM»

8. Отсоедините кабель USB.

9. В течение нескольких секунд, индикатор Link будет на, что означает, что они связаны.

10. Нажмите Загрузить, и эскиз будет успешно загружено на периферийное устройство.

 

Урок 22.Клавиатура и кодовый замок.Часть 2

Сегодня мы рассмотрим сборку кодового замка.Рассмотрим схему:

Безымянный22

Данный замок при нажатии кодовой цифры включает светодиод на определенный промежуток времени.Запрограммируем arduino следующим кодом:

#include <Keypad.h>

const byte ROWS = 4; // четыре ряда
const byte COLS = 3; // три колонки
char keys[ROWS][COLS] = {
{‘1′,’2′,’3’},
{‘4′,’5′,’6’},
{‘7′,’8′,’9’},
{‘*’,’0′,’#’}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; // подключение к строкам клавиатуры
byte colPins[COLS] = {8, 7, 6}; // подключение к столбцам клавиатуры

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
Serial.begin(9600);
pinMode(12, OUTPUT);
}

void loop(){
char key = keypad.getKey();

if (key){
Serial.println(key);
}
if (key == 4)//Наш код
{
// если номер совпал включим светодиод.
digitalWrite(12, HIGH);

delay(2000);

digitalWrite(12, LOW);
// и отправим сообщение.
Serial.println(«Hi elemic»);
}

Урок 21.Клавиатура.Или задел на замок.Часть 1.

В этом уроке мы рассмотрим пример работы с клавиатурой 4х4 и даже замахнемся на кодовый замок.Рассмотрим подключение клавиатуры:Безымянный21

Рассмотрим пример кода и скачаем библиотеки: https://cloud.mail.ru/public/CGsW/mQqU2XSdQ

В данном примере мы рассмотрим набор текста и вывод его в «Мониторе порта»

#include <Keypad.h>

const byte ROWS = 4; // четыре ряда
const byte COLS = 3; // три колонки
char keys[ROWS][COLS] = {
{‘1′,’2′,’3’},
{‘4′,’5′,’6’},
{‘7′,’8′,’9’},
{‘*’,’0′,’#’}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; // подключение к строкам клавиатуры
byte colPins[COLS] = {8, 7, 6}; // подключение к столбцам клавиатуры

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
Serial.begin(9600);
}

void loop(){
char key = keypad.getKey();

if (key){
Serial.println(key);
}
}

Урок 19.Работа с часами реального времени

Рассмотрим в этом уроке работу с часами реального времени.Данный урок понадобиться нам для создание даталоггера. Устройство записывающие сигналы в зависимости от времени.Рассмотрим вывод времени с помощью

Соберем сxему:

Безымянный19
RTC DS1302 Arduino UNO
GND                  GND
VCC                   +5V
RST                     10
CLK                     13
DAT                    12

Библиотеки можно скачать тут: https://cloud.mail.ru/public/96gE/RRqfV1VCU
Запрограммируем arduino следующим кодом:

#include RTC time;// подключаем библиотеки
void setup() {
delay(300);
Serial.begin(9600);// настраиваем порт
time.begin(RTC_DS1302,10,13,12);// инициализируем модуль
}

void loop()

{

if(millis()%1000==0){ // если секунда прошла

Serial.println(time.gettime(«d-m-Y, H:i:s, D»)); // выводим данные

delay(1); // Ждем одну милисекунду чтобы избежать ошибку

} }

Удачи.Пользуйтесь на здоровье.

 

Урок 20.Юбилейный и музыкальный

В этом уроке мы рассмотрим звуковоспроизводящие устройство и систему звуковоспроизведения на основе его.И так.Вашему вниманию представляется — зуммер.Зуммер это — сигнальное устройство, пьезоэлектрическое. Типичное применение находят в телефонах, различных оповещателях, устройствах сигнализации, электронных часах, бытовой технике, игрушках.Принцип действия пьезоэлектрических звукоизлучателей построен на использовании пьезоэлектрического эффекта. Часто звук напоминает,  напоминает«пип».

Рассмотрим схему подключения:

Безымянный20

Запрограммируем arduino следующим кодом:

// Создаем ноты для нашей песни
int C = 131;
int D = 147;
int E = 165;
int F = 175;
int G = 196;

// создаем массив для хранения значений
int songNotes[] = {E,E,E,E,E,E,E,G,C,D,E,F,F,F,F,F,E,E,E,G,G,F,D,C};
// создать еще массив для хранения длительности нот
int noteDurations[] = {4,4,2,4,4,2,4,4,4,4,1,4,4,4,4,4,4,4,4,4,4,4,4,1};

void setup() {
// 1 секунда делится по длине ноты
// регулировки значения 600 может изменить темп
for (int i = 0; i < 24; i ++) {
// играет наш звон раз
// 1 секунда делится по длине ноты
// регулировки значения 600 могут изменить темп
int noteDuration = 600/noteDurations[i];
// посылает сигнал к контакту 10
tone(10, songNotes[i], noteDuration);

// пауза между нотами, чтобы услышать их лучше
// это также может быть использовано для регулировки темпа
int pauseBetweenNotes = noteDuration * 1.3;
delay(pauseBetweenNotes);
// прекращаем игру
noTone(10);
}
}

void loop() {
// цикл не используется
}

Какая песня и что вообще все это значит.Мы расскажем в следующих уроках.Удачи вам.

gsm модуль SIM800L или как можно смс отправить с arduino

Модуль представляет собой чип gsm/sprs sim800l, который позволяет связаться с любым устройством по сотовой сети или выйти в интернет и передать на сторонний сервер.

Модуль обладает следующими характеристиками:
Частота-850/900/1800 / 1900MHz
GPRS подключение class 12: макс скорость передачи 85.6kbps
Мобильная станция класса B
Управляется AT Command 3GPP TS 27.007, 27.005 от SIMCOM
Поддержка часов реального времени
Диапазон напряжения питания 3.4V ~ 4.4V
Поддержка A-GPS
Поддержка 3.0V до 5,0 для работы с сигналами
Низкое энергопотребление, 1 мА в режиме ожидания
Компактный размер 23mm х 35 мм х 5,6 мм
SIM-карта стандарта microsim

Рассмотрим два способа работы с модулем. Первый это взаимодействие с компьютером. Для начала нам необходима программа putty http://putty.org.ru/ Теперь в режиме работы с serial портом, установите значения программатора необходимого для подключения. Но сначала соедините программатор и модуль следующим образом:

GND
+3.3V
Tx
Rx
RST
GND
VCC
Rx
Tx
GRN

Теперь не подавая питания подключаем sim карту. Ждем одну минуту для старта. Теперь открываем консоль и пишем команду «AT».Получаем на нее ответ в виде «OK».

adafruit_products_ATДалее используя список at команд https://cloud.mail.ru/public/5Zo2/hPbWSw4U4

Если вы захотите мне позвонить или написать с помощью модуля, то следует подключить его к блоку питанию.

Второй же способ. Это подключение arduino к модулю. Подключим модуль rx и tx к 7 и 8. Рассмотрим код:

#include <SoftwareSerial.h>
#include <String.h>

SoftwareSerial gprsSerial(7,8);

void setup()
{
gprsSerial.begin(19200); // Cкорость передачи данных модуля
Serial.begin(19200);
delay(500);
}

void loop()
{

if (Serial.available())
switch(Serial.read())
{
case ‘t’:// Если символ ‘T’
SendTextMessage(); // Отправить текстовое сообщение
break;
case ‘d’: // Если символ ‘D’
DialVoiceCall(); // Набираем номер
break;
}
if (gprsSerial.available()){
Serial.write(gprsSerial.read());
}
}
void SendTextMessage()
{
Serial.println(«Sending Text…»);
gprsSerial.print(«AT+CMGF=1\r»);// Установить режим SMS
delay(100);
gprsSerial.println(«AT+CMGS = \»+xxxxxxxxxx\»»);//набираем номер
delay(100);
gprsSerial.println(«Hello elemic»);// содержание сообщения
delay(100);
gprsSerial.print((char)26);//the ASCII code of the ctrl+z is 26 (required according to the datasheet)
delay(100);
gprsSerial.println();
Serial.println(«Text Sent.»);
}

void DialVoiceCall()
{
gprsSerial.println(«ATD+xxxxxxxxxx;»);// набираем номер, он должен включать страну и код оператора
delay(100);
gprsSerial.println();
}

Oled 128х64 или как можно было так издеваться надо дисплеями

Стоит признать что это единственный дисплей, за который не стыдно.

Этот дисплей мал, всего около 1,3 «по диагонали, но  с очень четким из-за высокой контрастности с OLED дисплеем. Этот дисплей выполнен из 128х64 отдельных белых OLED пикселей, каждый из которых управляется с помощью микросхемы контроллера.Поэтому дисплею не нужна подсветка и значим он становится экономичным устройством. Микросхема драйвера, SSD1306 может общаться c помощью: I2C. Сам OLED-требуют 3,3 в питания. Дисплей в при выводе изображения на весь экран, потребляет 40мА. С помощью дисплея можно печатать текст, выводить изображения и различные фигуры.

Характеристики

Размер экрана по диагонали: 1.30 »

Количество пикселей: 128 × 64

Глубина цвета: монохромный (белый)

Вес (г): 2,18

Яркость (кд / м2): 100 (Typ)  12

Вес: 8,5 г

Библиотеки для дисплея можно скачать тут: https://cloud.mail.ru/public/Bbqh/11UJFeFVR

Рассмотрим пример кода для дисплея.

 

#include <OLED_I2C.h>

OLED myOLED(SDA, SCL, 8);

extern uint8_t SmallFont[];

double vectors[8][3] = {{20, 20, 20},{-20, 20, 20},{-20, -20, 20},{20, -20, 20},{20, 20, -20},{-20, 20, -20},{-20, -20, -20},{20, -20, -20}};

double perspective = 100.0f;
int deltaX, deltaY, deltaZ, iter = 0;
long stime, fps = 0, frames = 0;

void setup()
{
randomSeed(analogRead(0));

myOLED.begin();
myOLED.setFont(SmallFont);
}

void loop()
{
stime = micros();
myOLED.clrScr();
drawVectors();
if (iter == 0)
{
deltaX = random(7) — 3;
deltaY = random(7) — 3;
deltaZ = random(7) — 3;
iter = random(250) + 5;
}
rotateX(deltaX);
rotateY(deltaY);
rotateZ(deltaZ);
iter—;
fps += 1000000 / (micros()-stime);
frames++;
myOLED.printNumI(fps / frames, 0, 0, 3); // Print average FPS on screen
myOLED.update();
}

int translateX(double x, double z)
{
return (int)((x + 64) + (z * (x / perspective)));
}

int translateY(double y, double z)
{
return (int)((y + 32) + (z * (y / perspective)));
}

void rotateX(int angle)
{
double rad, cosa, sina, Yn, Zn;

rad = angle * PI / 180;
cosa = cos(rad);
sina = sin(rad);
for (int i = 0; i < 8; i++)
{
Yn = (vectors[i][1] * cosa) — (vectors[i][2] * sina);
Zn = (vectors[i][1] * sina) + (vectors[i][2] * cosa);
vectors[i][1] = Yn;
vectors[i][2] = Zn;
}
}

void rotateY(int angle)
{
double rad, cosa, sina, Xn, Zn;

rad = angle * PI / 180;
cosa = cos(rad);
sina = sin(rad);
for (int i = 0; i < 8; i++)
{
Xn = (vectors[i][0] * cosa) — (vectors[i][2] * sina);
Zn = (vectors[i][0] * sina) + (vectors[i][2] * cosa);
vectors[i][0] = Xn;
vectors[i][2] = Zn;
}
}

void rotateZ(int angle)
{
double rad, cosa, sina, Xn, Yn;

rad = angle * PI / 180;
cosa = cos(rad);
sina = sin(rad);
for (int i = 0; i < 8; i++)
{
Xn = (vectors[i][0] * cosa) — (vectors[i][1] * sina);
Yn = (vectors[i][0] * sina) + (vectors[i][1] * cosa);
vectors[i][0] = Xn;
vectors[i][1] = Yn;
}
}

void drawVectors()
{
myOLED.drawLine(translateX(vectors[0][0], vectors[0][2]), translateY(vectors[0][1], vectors[0][2]), translateX(vectors[1][0], vectors[1][2]), translateY(vectors[1][1], vectors[1][2]));
myOLED.drawLine(translateX(vectors[1][0], vectors[1][2]), translateY(vectors[1][1], vectors[1][2]), translateX(vectors[2][0], vectors[2][2]), translateY(vectors[2][1], vectors[2][2]));
myOLED.drawLine(translateX(vectors[2][0], vectors[2][2]), translateY(vectors[2][1], vectors[2][2]), translateX(vectors[3][0], vectors[3][2]), translateY(vectors[3][1], vectors[3][2]));
myOLED.drawLine(translateX(vectors[3][0], vectors[3][2]), translateY(vectors[3][1], vectors[3][2]), translateX(vectors[0][0], vectors[0][2]), translateY(vectors[0][1], vectors[0][2]));
myOLED.drawLine(translateX(vectors[4][0], vectors[4][2]), translateY(vectors[4][1], vectors[4][2]), translateX(vectors[5][0], vectors[5][2]), translateY(vectors[5][1], vectors[5][2]));
myOLED.drawLine(translateX(vectors[5][0], vectors[5][2]), translateY(vectors[5][1], vectors[5][2]), translateX(vectors[6][0], vectors[6][2]), translateY(vectors[6][1], vectors[6][2]));
myOLED.drawLine(translateX(vectors[6][0], vectors[6][2]), translateY(vectors[6][1], vectors[6][2]), translateX(vectors[7][0], vectors[7][2]), translateY(vectors[7][1], vectors[7][2]));
myOLED.drawLine(translateX(vectors[7][0], vectors[7][2]), translateY(vectors[7][1], vectors[7][2]), translateX(vectors[4][0], vectors[4][2]), translateY(vectors[4][1], vectors[4][2]));
myOLED.drawLine(translateX(vectors[0][0], vectors[0][2]), translateY(vectors[0][1], vectors[0][2]), translateX(vectors[4][0], vectors[4][2]), translateY(vectors[4][1], vectors[4][2]));
myOLED.drawLine(translateX(vectors[1][0], vectors[1][2]), translateY(vectors[1][1], vectors[1][2]), translateX(vectors[5][0], vectors[5][2]), translateY(vectors[5][1], vectors[5][2]));
myOLED.drawLine(translateX(vectors[2][0], vectors[2][2]), translateY(vectors[2][1], vectors[2][2]), translateX(vectors[6][0], vectors[6][2]), translateY(vectors[6][1], vectors[6][2]));
myOLED.drawLine(translateX(vectors[3][0], vectors[3][2]), translateY(vectors[3][1], vectors[3][2]), translateX(vectors[7][0], vectors[7][2]), translateY(vectors[7][1], vectors[7][2]));
}