steins-ursel
Aktives Mitglied
Hallo!
Bin wieder am tüfteln. Diesmal hat es mir ein QMC5883 angetan. Diesen gibt es auch als HMC5883, nur ist hier die Registerbelegung unterschiedlich.
Angeregt wurde ich dabei von dieser Seite. Die Bibliotheken für den QMC5883 bekommt man von hier.
Die Installation (Linux) geht wie folgt:
Die eigentliche Software ist in Python geschrieben unter zu Hilfenahme von PyGame, es soll ja grafisch werden. Das verzwickte waren die Vektorberechnungen für die Kompassnadel in Abhängigkeit zur Fenstergröße. Aktuell ist es erst mal statisch geworden, eine dynamische Variante ist in Vorbereitung.
Anbei der Quelltext (Programm):
Wie ich das Ganze nun HW-mäßig weiterbaue, weiß ich nicht nicht so richtig, da der Sensor
1. kalibriert werden muss, es gibt das was, läuft aber natürlich nicht auf meinem Equipment.
2. die Lage unheimlich wichtig ist, um sauber die Himmelsrichtungen nur aus einer Achse zu ermitteln, bei allen dreien wird's kniffelig.
Bin wieder am tüfteln. Diesmal hat es mir ein QMC5883 angetan. Diesen gibt es auch als HMC5883, nur ist hier die Registerbelegung unterschiedlich.
Angeregt wurde ich dabei von dieser Seite. Die Bibliotheken für den QMC5883 bekommt man von hier.
Die Installation (Linux) geht wie folgt:
Bash:
#!/bin/bash
mkdir ~/tmp
cd ~/tmp
git clone https://github.com/RigacciOrg/py-qmc5883l
cd ./py-qmc5883l
sudo python3 setup.py install
Die eigentliche Software ist in Python geschrieben unter zu Hilfenahme von PyGame, es soll ja grafisch werden. Das verzwickte waren die Vektorberechnungen für die Kompassnadel in Abhängigkeit zur Fenstergröße. Aktuell ist es erst mal statisch geworden, eine dynamische Variante ist in Vorbereitung.
Anbei der Quelltext (Programm):
Python:
import py_qmc5883l
import time
sensor = py_qmc5883l.QMC5883L()
import pygame
import math
# Initializing Pygame
pygame.init()
# Initialing Color
red = (255,0,0)
back = (64,0,0)
# Initializing screen
screen = pygame.display.set_mode((440,440))
screen.fill(back)
# Drawing Circle
pygame.draw.ellipse(screen, red, [20,20,400,400], 3)
pygame.display.flip()
#init old x,y Coordinates
cwxa = 0
cwya=200
#set font north, east ... and print
schrift = pygame.font.SysFont('Arial', 20, True, False)
text = schrift.render("N", True, red)
screen.blit(text, [210, 0])
text = schrift.render("W", True, red)
screen.blit(text, [0, 210])
text = schrift.render("O", True, red)
screen.blit(text, [420, 210])
text = schrift.render("S", True, red)
screen.blit(text, [210,420])
#init trigger for loop
aktiv = True
#font for angle in degrees
schrift = pygame.font.SysFont('Arial', 40, True, False)
while aktiv:
#delete last angle
pygame.draw.rect(screen, back, [10,10,100,40])
#get the new angle
cwg = float(("{:>3.0f}".format(sensor.get_bearing())))
#output angle
text = schrift.render(str(cwg), True, red)
screen.blit(text, [10,10])
#angle in degrees to arcs
cwb = cwg * math.pi / 180 # sin/cos only in arcs
#calculate x,y from arcs in circle
cwy = float(("{:>3.0f}".format(190*math.cos(cwb))))
cwx = float(("{:>3.0f}".format(190*math.sin(cwb))))
#calculate coordinates for the remove line an new line
pygame.draw.line(screen, back, [cwxa+220, 440-(cwya+220)], [220, 220],5)
pygame.draw.line(screen, red, [cwx+220,440-(cwy+220)], [220, 220],5)
#safe the old coordinates
cwxa = cwx
cwya = cwy
#get the escape
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
aktiv = False
time.sleep (.33)
pygame.quit()
Wie ich das Ganze nun HW-mäßig weiterbaue, weiß ich nicht nicht so richtig, da der Sensor
1. kalibriert werden muss, es gibt das was, läuft aber natürlich nicht auf meinem Equipment.
2. die Lage unheimlich wichtig ist, um sauber die Himmelsrichtungen nur aus einer Achse zu ermitteln, bei allen dreien wird's kniffelig.