Ich schreibe über Themen die mich Beschäftigen. Am liebsten sind das Themen, die bei mir Probleme machten und ich eine Lösung gefunden habe. Als Software Entwickler springe oft auf verschiedenen Plattformen unterwegs, wie auf MS Windows, Linux oder auf Microcontrollern.
Beleuchtung mit dem ATtiny 45 (Ausbessern)
Link abrufen
Facebook
X
Pinterest
E-Mail
Andere Apps
-
In meinem vorigen Post habe ich bereits geschrieben, dass die vorhandenen LEDs für meine Beleuchtung nicht alle vollständig durchgesteuert werden können. Der Grund liegt an dem verwendeten Spannungsregler, der für den Betrieb ca. 100mA zur Verfügung stellt und kurzzeitig auch bis zu 150mA. Die Lichtausbeute war somit nur eingeschränkt möglich.
Neu ist eine hintere LED Leiste mit fünf blauen und vier weißen LEDs. Dieser benötigt alleine bereits bis zu 200mA und da würde schon der einfache Spannungsregler nicht lange funktionieren. Nun mit dem etwas größer dimensionierten Spannungsregler sind solche Schwierigkeiten obsolet und am Programm muss nichts extra verändert werden, um Einsparungen für den Stromverbrauch vorzunehmen. Zudem können alle 16 LED RGBs (WS2812b) vollständig durchgeschaltet werden, ohne das die Spannung einbricht.
Kommen wir zu den Änderungen. Wie bereits erwähnt verwende ich einen anderen Spannungsregler von STMicroelectronics. Die Bezeichnung lautet L7805CV und fällt schon durch ein größeres Gehäuse auf, das der TO-220 Norm entspricht. Mit dem neuen kommen auch ungepolte Kondensatoren mit einer deutlichen kleineren Kapazität.
Die Schaltung ist dem Vorgänger sehr ähnlich und zeigt im Unterschied die neuen Anschlüsse für die hintere LED Leiste. Ebenfalls habe ich das Zusammenlöten der Komponenten so eingeplant, dass alles auf einer Platine Platz findet.
Zusammengelötet und fast fertig auf der Platine.
Am Quellcode kann nun das Ansteuern des Pin 1 ergänzt werden. Damit wird später die hintere Lichtleiste ein- und ausgeschaltet.
// NeoPixel Bibliothek hinzufügen für die Ansteuerung der WS2812B LED Streifen #include <Adafruit_NeoPixel.h>
// Instanz initialisieren // Parameter Angaben: // 1. Anzahl für verwendeter RGB LEDs // 2. Auf welchen Pin soll verwendet werden. // 3. Auswahl zwischen RGB, GRB oder BRG und verwendeter Takt 400KHz oder 800KHz Adafruit_NeoPixel pixels = Adafruit_NeoPixel(4, 2, NEO_GRB + NEO_KHZ800);
// Helligkeit einstellen. Kann von 0 bis Maximal 255 festgelegt werden. // Bei Maximaler Ausleuchtung ist zu prüfen, ob die Maximale Stromabnahme erreicht wird. int brightness = 100;
// Helligkeit bei verwendung der WS2812b, wenn sie weis auf blitzen sollen. // Bei 210 wird die Maximale Stromabnahme überschritten. // Darf nur kurz verwendet werden, ansonsten brennt der Spannungsregler durch. int brightnessWhite = 210;
// Wird zum festlegen des Licht Einstellung verwendet. // Damit die Einstellung funktioniert, // muss an der Fernsteuerung einmal hin und her Geschaltet oder gedreht werden, // um die längste Pulslänge zu ermitteln. unsigned long maxPwmIn = 2;
void setup() { // Signal von der Fernsteuerung aufnehmen. pinMode(3, INPUT); // Positionslichter schalten pinMode(0, OUTPUT); // Neu. Um die LED Leiste ein- und auszuschalten. pinMode(1, OUTPUT); // RGB LEDs Stribes starten pixels.begin(); pixels.show(); }
void loop() { // Signal von der Fernsteuerung einlesen. // Für die Verwendung sollte ein Schalter genutzt werden. unsigned long pwmIn = pulseIn(3, HIGH); // Wird zum Anlernen verwendet. Durch festlegen der maximalen Pulslänge // können zwei Zustände verwendet werden. if(pwmIn > maxPwmIn) { maxPwmIn = pwmIn; }
// Wenn das Signal kürzer ist als der Maximalen Pulslänge. if(pwmIn < maxPwmIn - 100){ // Positionslichter einschalten // (Bei verwendung von NPN Transisitor, kann die '255 -' weg) analogWrite(0, 255 - brightness); delay(100); // Ausschalten (Bei NPN, den Wert auf 0 setzen.) analogWrite(0, 255); delay(100); // Die LED Leiste einschalten analogWrite(1, 255); // RGB LED Streifen ansteuern. // Rot und Grün allRGB_LED_Off(); pixels.setPixelColor(0, pixels.Color(brightness, 0, 0)); pixels.setPixelColor(1, pixels.Color(0, brightness, 0)); pixels.show(); delay(100); allRGB_LED_Off(); pixels.setPixelColor(2, pixels.Color(brightness, 0, 0)); pixels.setPixelColor(3, pixels.Color(0, brightness, 0)); pixels.show(); delay(100); } else { // Positionslichter ausschalten // (Bei verwendung von NPN Transisitor, ist zum Ausschalten der Wert 0) analogWrite(0, 255); // Die LED Leiste ausschalten. analogWrite(1, 255); // RGB LED Streifen ansteuern. for(int i = 0; i < 4; i++) { // Alle aus. allRGB_LED_Off(); // Mit der Aktuellen Iteration als Index verwenden, // um den entsprechende RGB LED zu überschreiben. pixels.setPixelColor(i, pixels.Color(brightnessWhite, brightnessWhite, brightnessWhite)); pixels.show(); delay(100); } } } // Stellt alle Werte zurück. void allRGB_LED_Off() { for(int i = 0; i < 4; i++) { pixels.setPixelColor(i, pixels.Color(0, 0, 0)); } }
Brushless am Arduino zum testen. Vielleicht für den einen oder anderen Interessant, wie eigentlich ein Brushless Motor angeschlossen wird. Für die Versorgung sind zwei Zuleitung an den Regler, die jeweils mit Rot und Schwarz farblich zu erkennen sind. Andernfalls sind am Regler die Pol Richtung gekennzeichnet. Zum Bürstenlosen Motoren führen jedoch 3 Leitungen ab. In meinem Beispiel sind die Leitungen blau, andernfalls sind die Leitungen am Regler ebenfalls Kennzeichnet. Der Motor selbst hat wiederum gelb, rot und schwarz. Links zusehen, die Plus und Minus Kennzeichnung. Rechts die Kennzeichen A, B und C. Den ersten Blauen, bzw. hier Kennzeichen B, verbinde ich mit Schwarz. Im folgendem Bild ist der gelbe Leitung an Kennzeichen A und Rot an Kennzeichen C verbunden. Nun dürfte nach Anschluss sich der Motor beim durchsteuern gegen den Uhrzeigersinn drehen. Motor dreht sich Linksrum (gegen den Uhrzeigersinn) Schließe ich den gelben an C und den roten an ...
Auf dem Markt gibt es viele verschiedene Module an Motortreibern. Diesmal verwende ich einen recht einfachen, der zur Ansteuerung bis zu vier PWM Signale verwendet. Der Motorschield für den Arduino hingegen benötigt noch eine Steuerung eines Shiftregister 74HC595. Ich weiß, das geht auch ohne, aber ich beziehe mich diesmal auf fertige Module, die kompakt aufgebaut sind. Aber nur ansteuern wäre diesmal zu langweilig und daher habe ich hier als Ziel, den Lego Technic Stunt-Racer damit zu betreiben. Wer das Modell kennt, weiß, dass dieser mit einer Infrarot Fernbedienung ausgeliefert wird und das eher nur in der Wohnung funktioniert. Benötigt wird: Modul MX1508 (DC Motor Treiber) Arduino Mini Pro (5V Ausführung) 2x Servo Kabel 2x Lego Power Function Verlängerungskabel Lego Technic Fahrzeug mit Power Function Zwei Kanal Fernsteuerung und ein Empfänger mit PWM...
Arduino Nano 3.0 und Modul mit einem Beschleunigungssensor Zugegeben habe ich etwas lange gebraucht, um zu verstehen, wie ich diesen Sensor auslesen kann. Das liegt einerseits daran, dass ich bisher noch nichts mit I²C oder SPI gemacht habe. Nachdem ich die Anleitung gelesen hatte, habe ich erst mal nur Bahnhof verstanden. Das änderte sich, als ich es hinbekam, die gemessenen Daten auszulesen. Da frage ich mich manchmal, warum ich das nicht gleich verstanden habe. Zum Glück gibt es ja google, das mich hin und wieder auf die richtige Seite bringt. Allerdings enthielten die Erklärungen teilweise große Lücken im Verlauf. Vielleicht schaffe ich es hier in meinem Blog dies näher und leichter zu erläutern. Und wenn nicht, kann hier entsprechend auch einen Kommentar abgeben werden für Verbesserungen. Dafür bin ich immer offen. Zunächst haben wir hier den Sensor von Bosch Sensortec, den BMA020. Auf den 2 Bildern ist das Modul zu sehen, auf den der Sensor gelötet ist. Im Grunde ist es d...
Kommentare