http://sites.schaltungen.at/arduino-uno-r3/anleitung-tutorial/simtronyx
Wels, am 2018-11-24BITTE nützen Sie doch rechts OBEN das Suchfeld [ ] [ Diese Site durchsuchen]DIN A3 oder DIN A4 quer ausdrucken
*******************************************************************************I** DIN A4 ausdrucken siehe http://sites.schaltungen.at/drucker/sites-prenninger********************************************************I* ~015_b_PrennIng-a_arduino.uno.r3-anleitung.tutorial-simtronyx (xx Seiten)_1a.pdf
Untergeordnete Seiten (12):
Neueste Beiträge
Ronny Simon
Kanzlerstraße 60
+49 (0)1578 / 49 81174
mailto:[email protected]
Quelle:
http://blog.simtronyx.de/category/arduino/breadboard-schaltungen/sensor-schaltungen/
Digitale Wasserwaage: ADXL345, TFT (HY-1.8 SPI) und ein Arduino
Mithilfe eines Beschleunigungssensors, welcher aufgrund seiner Eigenschaften sich die Gravitation zu nutze zu machen, auch als Lagesensor verwendet werden kann, simulieren wir heute eine Wasserwaage.
Dazu verwenden wir einen ADXL345, einen Arduino Nano ein TFT-Display (HY-1.8 SPI) und ein paar weitere Teile.
Für weitere Informationen (z.B. Pinbelegungen von Bauteilen oder genaue Kabelverbindungen)
mit der Maus über Elemente fahren (oder im Touch-Modus: Elemente antippen)...
Achtung, es gibt diverse ADXL345-Breakoutboards wovon einige keinen Spannungsregler haben und welche deshalb mit 3,3V betrieben werden müssen, auf diese wird hier nicht eingegangen! Ansonsten kann natürlich jedes andere ADXL345-Breakoutboard verwendet werden, jedoch muss dann natürlich die Verdrahtung angepasst werden. Zusätzlich wird noch ein Taster (der Widerstand an Masse ist 10kOhm) benötigt, welcher dazu dient die Wasserwaage zu Eichen. Dazu wird der ganze Aufbau auf den Boden oder eine sich in Waage befindliche Oberfläche gelegt und der Taster kurz gedrückt. Programmcode (Sketch):Zuerst benötigen wir noch eine ADXL345-Bibliothek und 2 Bibliotheken zur Ansteuerung des Displays. Dies wäre einerseits die Adafruit-Bibliothek zur Ansteuerung des Display-Chipsatzes (ST7735) und dann eine Grafik-Bibliothek ebenfalls von Adafruit. Nun laden wir noch folgenden Sketch auf den Arduino:
Sketch Wasserwaage_ADXL345_und_HY_1_8_SPI
#include <Wire.h>
#include <ADXL345.h> #define cs 10 // Arduino-Pin an Display CS #define dc 9 // Arduino-Pin an Display A0 #define rst 8 // Arduino Reset-Pin #include "Adafruit_GFX.h" // Adafruit Grafik-Bibliothek #include "Adafruit_ST7735.h" // Adafruit ST7735-Bibliothek #include <SPI.h> Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst); // Display-Bibliothek Setup ADXL345 accel; #define button_correction 3 void setup(void){ Serial.begin(9600); pinMode(button_correction, INPUT); // Sensor accel.begin(); // Sensor initialisieren accel.setRange(accel.RANGE_16G); // Empfindlichkeit einstellen // Display tft.initR(INITR_BLACKTAB); // ST7735-Chip initialisieren tft.setTextWrap(true); display_show(); } const float alpha = 0.5; double fXg = 0; double fYg = 0; double fZg = 0; double x_correction=0; double y_correction=0; int x_value=0; int y_value=0; int old_x_value=1; int old_y_value=1; #define filter_count_max 40 byte filter_count=0; #define correction_precision 300 // Sollte Anzeige im Liegen wackeln Wert vermindern void loop(void){ double pitch, roll, Xg, Yg, Zg; accel.read(&Xg, &Yg, &Zg); fXg+=Xg; fYg+=Yg; filter_count++; if(filter_count==filter_count_max-1){ fXg/=filter_count_max; fYg/=filter_count_max; if(digitalRead(button_correction)==HIGH){ x_correction=fXg; y_correction=fYg; } x_value=(fXg-x_correction)*correction_precision; y_value=(fYg-y_correction)*correction_precision; //display_info(); display_graphic(); old_x_value=x_value; old_y_value=y_value; fXg=0; fYg=0; filter_count=0; } delay(5); } #define hx 27 #define hy 16 #define hw 95 #define hh 18 #define hb 7 #define vx 5 #define vy 38 #define vw 18 #define vh 95 #define vb 7 #define cx 75 #define cy 86 #define cr 45 #define cb 5 void display_show(){ tft.fillScreen(ST7735_BLACK); set_text(32,3,"Wasserwaage",ST7735_BLUE,1); set_text(14,149,"blog.simtronyx.de",ST7735_GREEN,1); tft.drawRect(hx-1,hy-1,hw+2,hh+2,rgb565(128,128,128)); tft.drawRect(hx+1,hy+1,hw-2,hh-2,rgb565(128,128,128)); tft.drawRect(hx,hy,hw,hh,ST7735_WHITE); tft.drawRect(vx-1,vy-1,vw+2,vh+2,rgb565(128,128,128)); tft.drawRect(vx+1,vy+1,vw-2,vh-2,rgb565(128,128,128)); tft.drawRect(vx,vy,vw,vh,ST7735_WHITE); tft.drawCircle(cx,cy,cr+1,rgb565(128,128,128)); tft.drawCircle(cx,cy,cr-1,rgb565(128,128,128)); tft.drawCircle(cx,cy,cr,ST7735_WHITE); } void display_graphic(){ if(x_value!=old_x_value){ tft.drawRect(hx+hw/2+constrain(old_x_value,-hw/2+(hb+1)/2,hw/2-(hb+1)/2)-(hb-1)/2,hy+2,hb,hh-4,rgb565(0,0,0)); tft.drawRect(hx+hw/2,hy+2,1,hh-4,rgb565(255,255,255)); tft.drawRect(hx+hw/2+constrain(x_value,-hw/2+(hb+1)/2,hw/2-(hb+1)/2)-(hb-1)/2,hy+2,hb,hh-4,rgb565(0+constrain(abs(x_value)*10,0,255),255-constrain(abs(x_value)*10,0,255),0)); } if(y_value!=old_y_value){ tft.drawRect(vx+2,vy+vh/2-(constrain(old_y_value,-vh/2+(vb+1)/2,vh/2-(vb+1)/2)+(vb-1)/2),vw-4,vb,rgb565(0,0,0)); tft.drawRect(vx+2,vy+vh/2,vw-4,1,rgb565(255,255,255)); tft.drawRect(vx+2,vy+vh/2-(constrain(y_value,-vh/2+(vb+1)/2,vh/2-(vb+1)/2)+(vb-1)/2),vw-4,vb,rgb565(0+constrain(abs(y_value)*10,0,255),255-constrain(abs(y_value)*10,0,255),0)); } if((x_value!=old_x_value)||(y_value!=old_y_value)){ float hxv=old_x_value; float hyv=old_y_value; float l=sqrt(hxv*hxv+hyv*hyv); if(l>cr-cb-2){ hxv=hxv/l*(cr-cb-2); hyv=hyv/l*(cr-cb-2); } tft.fillCircle(cx+hxv,cy-hyv,cb,rgb565(0,0,0)); tft.drawCircle(cx,cy,cb+2,rgb565(255,255,255)); hxv=x_value; hyv=y_value; l=sqrt(hxv*hxv+hyv*hyv); if(l>cr-cb-2){ hxv=hxv/l*(cr-cb-2); hyv=hyv/l*(cr-cb-2); } tft.fillCircle(cx+hxv,cy-hyv,cb,rgb565(0+constrain((((abs(x_value)+abs(y_value))/2)*10),0,255),255-constrain((((abs(x_value)+abs(y_value))/2)*10),0,255),0)); } } void display_info(){ if(x_value!=old_x_value){ set_text(4,16,value_to_string(old_x_value),ST7735_BLACK,1); set_text(4,16,value_to_string(x_value),ST7735_WHITE,1); } if(y_value!=old_y_value){ set_text(4,26,value_to_string(old_y_value),ST7735_BLACK,1); set_text(4,26,value_to_string(y_value),ST7735_WHITE,1); } } void set_text(int x,int y,String text,int color,int size){ tft.setTextSize(size); tft.setCursor(x,y); tft.setTextColor(color); tft.print(text); } // Hilfsfunktionen uint16_t rgb565(uint8_t r, uint8_t g, uint8_t b){ return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); } String value_to_string(int value){ String value_string = String(value); return value_string; } und schon ist die Wasserwaage einsatzbereit. Bauteile (Bezugsquellen):
http://blog.simtronyx.de/digitale-wasserwaage-adxl345-tft-hy-1-8-spi-und-ein-arduino/#more-3781
Digitaler Kompass: HMC5883L (GY-271), TFT (HY-1.8) und ein ArduinoMit dem Magnetfeldsensor HMC5883L (auf dem GY-271 Breakoutboard) bauen wir uns heute einen digitalen Kompass, zusätzlich zur besseren Visualisierung verwenden wir ein 1.8 Zoll TFT-Display und natürlich einen Arduino. Digitaler Kompass: HMC5883L (GY-271), TFT (HY-1.8) und ein Arduino – blog.simtronyx.de SchaltplanZuerst verdrahten wir unsere Komponenten nach folgender Tabelle/Schaltplan:
Schaltplangröße:
Für weitere Informationen (z.B. Pinbelegungen von Bauteilen oder genaue Kabelverbindungen)
mit der Maus über Elemente fahren (oder im Touch-Modus: Elemente antippen)... SketchNun installieren wir noch eine Bibliothek für die Verwendung des HMC5883L und laden anschließend folgenden Sketch auf unseren Arduino:
Sketch
#include <Wire.h> // Wire-Bibliothek - fuer I2C
#include <HMC5883L.h> // HMC5883L-Bibliothek
#define cs 10 // Arduino-Pin an Display CS
#define dc 9 // Arduino-Pin an Display A0
#define rst 8 // Arduino Reset-Pin
#include "Adafruit_GFX.h" // Adafruit Grafik-Bibliothek
#include "Adafruit_ST7735.h" // Adafruit ST7735-Bibliothek
#include <SPI.h>
Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst); // Display-Bibliothek Setup
HMC5883L compass;
int error = 0;
void setup(void){
Serial.begin(9600);
Wire.begin();
// HMC5883L
compass = HMC5883L();
error=compass.SetScale(1.3);
if(error!=0)Serial.println(compass.GetErrorText(error));
Serial.println("Setting measurement mode to continous.");
error=compass.SetMeasurementMode(Measurement_Continuous);
if(error != 0)Serial.println(compass.GetErrorText(error));
// Display
tft.initR(INITR_BLACKTAB);
tft.setTextWrap(true);
display_show();
}
// Deklination (siehe Text) hier fuer Berlin 3" 19' = 0.0578 rad
float declinationAngle=0.0578;
float heading_degrees=0;
float heading_degrees_old=360;
float heading_degrees_correction=-90;
float heading_correction=heading_degrees_correction*M_PI/180;
void loop(void){
MagnetometerScaled scaled=compass.ReadScaledAxis();
float heading=atan2(scaled.YAxis,scaled.XAxis);
heading+=declinationAngle;
if(heading<0)heading+=2*PI;
if(heading>=2*PI)heading-=2*PI;
heading_degrees=heading*180/M_PI+heading_degrees_correction;
if(heading_degrees<0)heading_degrees+=360;
if(heading_degrees>=360)heading_degrees-=360;
if(heading_degrees!=heading_degrees_old){
display_info();
display_graphic();
heading_degrees_old=heading_degrees;
}
delay(250);
}
// Ausgabe TFT-Display
#define cx 64
#define cy 80
#define cr 45
#define cb 5
void display_show(){
tft.fillScreen(ST7735_BLACK);
set_text(14,3,"Digitaler Kompass",ST7735_BLUE,1);
set_text(14,149,"blog.simtronyx.de",ST7735_GREEN,1);
set_text(59,17,"N",ST7735_WHITE,2);
set_text(59,130,"S",ST7735_WHITE,2);
set_text(4,74,"W",ST7735_WHITE,2);
set_text(114,74,"O",ST7735_WHITE,2);
tft.drawCircle(cx,cy,cr+1,rgb565(128,128,128));
tft.drawCircle(cx,cy,cr-1,rgb565(128,128,128));
tft.drawCircle(cx,cy,cr,ST7735_WHITE);
}
void display_graphic(){
int m=0;
int h=heading_degrees_old+90;
tft.drawLine((int)cx,(int)cy,(int)(cx+(cr-4)*cos(M_PI/180*h)),(int)(cy-(cr-4)*sin(M_PI/180*h)),ST7735_BLACK);
h=heading_degrees+90;
tft.drawLine((int)cx,(int)cy,(int)(cx+(cr-4)*cos(M_PI/180*h)),(int)(cy-(cr-4)*sin(M_PI/180*h)),ST7735_WHITE);
}
void display_info(){
int h=heading_degrees_old;
String s=String((int)h);
set_text(103+(h<10?12:(h<100?6:0)),24,String((int)h),ST7735_BLACK,1);
tft.write(247);
h=heading_degrees;
s=String((int)h);
set_text(103+(h<10?12:(h<100?6:0)),24,s,rgb565(40,40,40),1);
tft.write(247);
}
void set_text(int x,int y,String text,uint16_t color,byte size){
tft.setTextSize(size);
tft.setCursor(x,y);
tft.setTextColor(color);
tft.print(text);
}
uint16_t rgb565(uint8_t r, uint8_t g, uint8_t b){
return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
}
Da die Magnetlinien der Erde jedoch nicht exakt gerade verlaufen, gibt es regionale Unterschiede in ihrer Ausrichtung. Dafür gibt es magnetische Karten und Modelle, die die entsprechenden Abweichungen ausgleichen und unseren Kompass noch genauer machen können. Glücklicherweise sind die Abweichungen ziemlich leicht über einige Seiten im Internet abrufbar, wie zum Beispiel hier für Deutschland oder hier weltweit. Haben wir die Abweichungen ermittelt, so tragen wir einfach die Werte unten ein und drücken auf “Ausrechnen”. (Im Beispiel unten ist die aktuelle Deklination für Berlin (DE) eingetragen.) float declinationAngle = 0.0578; Die Zeile oben wird dann einfach im Sketch ersetzt. Natürlich kann die Deklination auch auf “0.00” gesetzt werden, wenn der Kompass weltweit eingesetzt werden soll. Allerdings ist dann natürlich die Magnetnadel auch den regionalen Schwankungen ausgesetzt und ist somit deutlich ungenauer. Ergänzende BemerkungenDie Genauigkeit des digitalen Kompasses hängt natürlich auch von örtlichen Magnetfeldern ab. So beeinflussen beispielsweise Lautsprecher durch ihre Magneten, die Messung enorm. Dies können wir zum Beispiel einfach dadurch testen, in dem wir den Sensor in die Nähe eines Lautsprechers bewegen. Auch Mobiltelefone können den Ausschlag der Magnetnadel beeinflussen. Ebenfalls abweichende Ergebnisse erhalten wir, wenn der Sensor um die X- oder Y-Achse gedreht wird, deshalb sollte der Sensor in Ebene gehalten und nur um die Z-Achse gedreht werden. Bauteile (Bezugsquellen):
http://blog.simtronyx.de/digitaler-kompass-hmc5883l-gy-271-tft-hy-1-8-und-ein-arduino/
********************************************************I*
Impressum: Fritz Prenninger, Haidestr. 11A, A-4600 Wels, Ober-Österreich, mailto:[email protected]ENDE |
Anleitung-Tutorial >