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

 
» » » Механизм изменения ориентации экрана на основе акселерометра ADXL345 и Arduino



Механизм изменения ориентации экрана на основе акселерометра ADXL345 и Arduino

Автор: Mike(admin) от 9-05-2022, 03:55

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


Механизм изменения ориентации экрана на основе акселерометра ADXL345 и Arduino

В данном случае в качестве акселерометра мы использовали ADXL345, а в качестве микроконтроллерной платы взяли плату Arduino Nano. В роли дисплея была задействована светодиодная матрица 8x8 с драйвером MAXX7219.


Все было собрано на монтажной плате и выглядело так:


Механизм изменения ориентации экрана на основе акселерометра ADXL345 и Arduino

Схема данной платы:


Механизм изменения ориентации экрана на основе акселерометра ADXL345 и Arduino

Код программы для Arduino следующий:



#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>

#include <LedControl.h>

#define PIN_DATAIN 11
#define PIN_CLK 13
#define PIN_LOAD 10 

LedControl lc = LedControl(PIN_DATAIN, PIN_CLK, PIN_LOAD, 1);

Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

#define zero_x 1.569
 
#define zero_y 1.569
 
#define zero_z 1.569

void setup(void) 
{
#ifndef ESP8266
  while (!Serial);
#endif
  Serial.begin(9600);
  Serial.println("Accelerometer Test"); Serial.println("");
  
  if(!accel.begin())
  {
    Serial.println("Ooops, no ADXL345 detected ... Check your wiring!");
    while(1);
  }

  //accel.setRange(ADXL345_RANGE_16_G);
  // accel.setRange(ADXL345_RANGE_8_G);
  // accel.setRange(ADXL345_RANGE_4_G);
   accel.setRange(ADXL345_RANGE_2_G);

  lc.shutdown(0,false);
  lc.setIntensity(0,8);
  lc.clearDisplay(0);
  
}

void loop(void) 
{
  sensors_event_t event; 
  accel.getEvent(&event);


  
float xv;
float yv;
float zv;

xv=(event.acceleration.x-zero_x);
yv=(event.acceleration.y-zero_y);
zv=(event.acceleration.z-zero_z);

if ((abs(zv)  < 4.9) && (xv > 4.9)  && (abs(yv)  < 3.9)) {rotate_display('t');}
if ((abs(zv)  < 4.9) && (xv < -4.9) && (abs(yv)  < 3.9)) {rotate_display('b');} 
if ((abs(zv)  < 4.9) && (yv > 4.9)  && (abs(xv)  < 3.9)) {rotate_display('r');}
if ((abs(zv)  < 4.9) && (yv < -4.9) && (abs(xv)  < 3.9)) {rotate_display('l');}


delay(1000);
  
}

void rotate_display(char my_direction)
{
  lc.clearDisplay(0);
switch(my_direction){
  case 't':lc.setLed(0,7,4,true);lc.setLed(0,6,3,true);lc.setLed(0,6,5,true);break;//
  case 'b':lc.setLed(0,0,4,true);lc.setLed(0,1,3,true);lc.setLed(0,1,5,true);break;//
  case 'r':lc.setLed(0,4,7,true);lc.setLed(0,3,6,true);lc.setLed(0,5,6,true);break;///
  case 'l':lc.setLed(0,4,0,true);lc.setLed(0,3,1,true);lc.setLed(0,5,1,true);break;//
  }
      
  }



© digitrode.ru


Теги: Arduino, акселерометр, светодиодная матрица




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

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

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