Микроконтроллер представляет собой небольшую микросхему, которая содержит процессор, память и блоки ввода/вывода. Почти каждое электронное устройство на рынке содержит, по крайней мере, один микроконтроллер, и в результате этого существует множество различных моделей, доступных от многих производителей. Микроконтроллер ATtiny85, который был первоначально изготовлен Atmel, является особенным, потому что он очень компактный, доступный, дешевый, требует мало энергии и очень универсален. Если вам не нужно много выводов или много вычислительной мощности, ATtiny85 – это ваш выбор. В этом материале мы рассмотрим, как использовать его для создания небольшого электронного компаса.
Такой электронный компас будет примерно размером с типичный аналоговый карманный компас. Хотя аналоговый компас, вероятно, более практичен, так как не требует батареи и с меньшей вероятностью сломается. Но данный электронный проект отлично демонстрирует привлекательность ATtiny85. В дополнение к микросхеме AVR этот проект требует использования магнитометра HMC5883L, OLED I2C-экрана 0,96 SSD1306 128x64, LiPo батареи 3,7 В 300 мАч, кнопки и зарядного устройства TP4056. Вам также понадобится 3D-принтер для изготовления корпуса.
Микроконтроллер получает информацию о направлении от магнитометра. Эта информация затем отображается на OLED-дисплее. Таким образом, код показывает приблизительные векторы для основных направлений, а также показания с фактическими градусами вектора Севера.
Схема электронного компаса на ATtiny85 выглядит следующим образом.
Так как ATtiny85 очень мал и имеет несколько выводов, то его подключение можно осуществить навесным монтажом, как показано далее, а ненужные выводы отрезать. Загрузить код программы в ATtiny85, который представлен в конце данного материала, необходимо заранее до монтажа.
Распечатайте корпус компаса на 3D принтере.
Заранее сделайте выводы для зарядного устройства.
Затем начинайте размещать компоненты внутри корпуса компаса.
Сам компас готов. Теперь нужно распечатать корпус для зарядного устройства и выполнить необходимый монтаж, как показано далее.
Код программы компаса для ATtiny85, написанный в среде Arduino IDE, приводится далее. Эта программа имеет алгоритм автоматической калибровки. Вам нужно только включить устройство и повернуть компас на 360º.
#include <Wire.h>
#include "ssd1306.h"
#define address 0x1E // HMC5883
const int k92=92,k31=31,k26=26;
int xx,yy,zz;
float xxx,yyy,MaxX=-5000,MinX=5000,MaxY=-5000,MinY=5000;
const uint8_t G[4] = {
0B00111100,
0B01100110,
0B01100110,
0B00111100
};
const uint8_t PROGMEM N[8] = {
0B11111111,
0B11111111,
0B11111111,
0B00011110,
0B01111100,
0B11111111,
0B11111111,
0B11111111
};
const uint8_t PROGMEM S[8] = {
0B01001110,
0B11011111,
0B11011111,
0B11011011,
0B11011011,
0B11111011,
0B11111011,
0B01110010
};
const uint8_t PROGMEM E[8] = {
0B11111111,
0B11111111,
0B11111111,
0B11011011,
0B11011011,
0B11011011,
0B11000011,
0B11000011
};
const uint8_t PROGMEM W[8] = {
0B00111111,
0B01111111,
0B11111111,
0B01100000,
0B11111100,
0B01100000,
0B11111111,
0B01111111,
};
SPRITE sN,sS,sE,sW,sG;
void setup(){
Wire.begin();
Wire.beginTransmission(address);
Wire.write(0x02);
Wire.write(0x00);
Wire.endTransmission();
ssd1306_128x64_i2c_init();
ssd1306_fillScreen(0x00);
ssd1306_setFixedFont(ssd1306xled_font8x16);
sN = ssd1306_createSprite( 0, 0, 8, N);
sS = ssd1306_createSprite( 0, 0, 8, S);
sE = ssd1306_createSprite( 0, 0, 8, E);
sW = ssd1306_createSprite( 0, 0, 8, W);
sG = ssd1306_createSprite(34, 47, 4, G);
}
void loop(){
int b;
float a;
Wire.beginTransmission(address);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(address, 6);
if(6<=Wire.available()){
xx = Wire.read()<<8;
xx |= Wire.read();
zz = Wire.read()<<8;
zz |= Wire.read();
yy = Wire.read()<<8;
yy |= Wire.read();
}
if (xx>=MaxX) MaxX=xx;
if (xx<=MinX) MinX=xx;
if (yy>=MaxY) MaxY=yy;
if (yy<=MinY) MinY=yy;
xxx = -50+100*(xx-MinX)/(MaxX-MinX);
yyy = -50+100*(yy-MinY)/(MaxY-MinY);
a = atan2(yyy,-xxx);
b = a*180/PI-90;
if (b<0) b+=360;
if (b>180) b-=360;
sN.x=k92+k26*cos(a+PI); sN.y=k31+k26*sin(a+PI);
sS.x=k92+k26*cos(a); sS.y=k31+k26*sin(a);
sW.x=k92+k26*cos(a+PI/2); sW.y=k31+k26*sin(a+PI/2);
sE.x=k92+k26*cos(a-PI/2); sE.y=k31+k26*sin(a-PI/2);
sN.eraseTrace();sS.eraseTrace();sW.eraseTrace();sE.eraseTrace();
sN.draw();sS.draw();sW.draw();sE.draw();sG.draw();
printGrados(b);
}
void printGrados(int g){
char gStr[5] = "0000";
gStr[0] = (g<0) ? '-':' ';
g=abs(g);
gStr[1] = '0' + g / 100;
gStr[2] = '0' + (g /10)%10;
gStr[3] = '0' + (g % 100) % 10;
ssd1306_printFixed(0,50, gStr, STYLE_NORMAL);
}
© digitrode.ru