цифровая электроника
вычислительная техника
встраиваемые системы

 

Дешевый компас на микроконтроллере ATtiny85 своими руками

Автор: Mike(admin) от 29-06-2020, 03:35

Микроконтроллер представляет собой небольшую микросхему, которая содержит процессор, память и блоки ввода/вывода. Почти каждое электронное устройство на рынке содержит, по крайней мере, один микроконтроллер, и в результате этого существует множество различных моделей, доступных от многих производителей. Микроконтроллер ATtiny85, который был первоначально изготовлен Atmel, является особенным, потому что он очень компактный, доступный, дешевый, требует мало энергии и очень универсален. Если вам не нужно много выводов или много вычислительной мощности, ATtiny85 – это ваш выбор. В этом материале мы рассмотрим, как использовать его для создания небольшого электронного компаса.


Дешевый компас на микроконтроллере ATtiny85 своими руками

Такой электронный компас будет примерно размером с типичный аналоговый карманный компас. Хотя аналоговый компас, вероятно, более практичен, так как не требует батареи и с меньшей вероятностью сломается. Но данный электронный проект отлично демонстрирует привлекательность ATtiny85. В дополнение к микросхеме AVR этот проект требует использования магнитометра HMC5883L, OLED I2C-экрана 0,96 SSD1306 128x64, LiPo батареи 3,7 В 300 мАч, кнопки и зарядного устройства TP4056. Вам также понадобится 3D-принтер для изготовления корпуса.


Микроконтроллер получает информацию о направлении от магнитометра. Эта информация затем отображается на OLED-дисплее. Таким образом, код показывает приблизительные векторы для основных направлений, а также показания с фактическими градусами вектора Севера.


Схема электронного компаса на ATtiny85 выглядит следующим образом.


Дешевый компас на микроконтроллере ATtiny85 своими руками

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


Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками
Дешевый компас на микроконтроллере ATtiny85 своими руками
Дешевый компас на микроконтроллере ATtiny85 своими руками

Распечатайте корпус компаса на 3D принтере.


Заранее сделайте выводы для зарядного устройства.


Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками
Дешевый компас на микроконтроллере ATtiny85 своими руками

Затем начинайте размещать компоненты внутри корпуса компаса.


Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

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


Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

Дешевый компас на микроконтроллере ATtiny85 своими руками

Код программы компаса для 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


Теги: ATtiny, компас




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий