Der AVR-/ARDUINO-Faden

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

virtexultra
Beiträge: 127
Registriert: So 9. Dez 2018, 11:30

Re: Attiny 412 (tinyAVR) SPI ausschalten

Beitrag von virtexultra »

Ka6Pilot hat geschrieben: Sa 21. Jan 2023, 17:24 ich bin gerade dabei, mit einem Attiny 412 und einem MAX31855 herumzuexperimentieren.
Mal etwas ins blaue geraten:

schaue dir mal das SSD Bit im CTRLB Register an. Ich könnte mir vorstellen das die SPI Periph in den Slave Modus schaltet, wenn CS im Input Modus ist und extern irgendwie low wird. Überprüfbar sollte das per CTRLA.MASTER sein.

Ich würde mir wegen dem Leakage Current des SPI Interfaces weniger Sorgen machen - 1µA max. pro Pin ist ja nicht wirklich viel.

Du könntest einen Pin sparen wenn du das OC Bit des MAX31855 auswertest um zu prüfen ob ein TC angeschlossen ist.

Auf den Oszillogrammen kann ich nicht wirklich etwas erkennen. CS? sieht auf Bild2 deutlich länger aus als auf Bild 3/1.
ch_ris
Beiträge: 3029
Registriert: Mo 30. Nov 2015, 10:08

Re: Der AVR-/ARDUINO-Faden

Beitrag von ch_ris »

Code: Alles auswählen

bool checkTTL() {
	pinMode(pinTX, INPUT_PULLUP);
	pinMode(pinRX, INPUT_PULLUP);
	delay(10);
	return (digitalRead(pinTX) && digitalRead(pinRX) ); 
}
Die Methode soll entscheiden ob Serial gestartet wird oder nicht.
Bei einem Tiny85. Die Pins sind die Komparator Pins, die sollen dann was richtiges machen wenn kein Adapter angesteckt ist.
Adapter ohne VCC, der Tiny kriegt seinen Strom extern.
Frage: zieht der stromlose TTL Adapter, ohne Computer dran, RX und/oder TX auf low?
Bei dem Schaltplan von meinem, bzw. von dem den ich grade hab, sieht es so aus,
da sind 3 Dioden in Reihe gegen GND. Bei 5v sollte das doch reichen für low. messe ich nach.
Aber: ist das so üblich oder könnte mir ein anderer Adapter ein Strich durch die Rechnung machen?
Bumbum
Beiträge: 280
Registriert: Mi 22. Apr 2015, 19:04

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bumbum »

Hallo,

ich habe mir SG90 Servos bestellt und wollte diese gerade mit einem Arduino verheiraten. Allerdings klappt es nicht so wie erwartet. Die Servos "ticken" nur, wenn der Arduino ein PWM-Signal ausgibt. Laut Google soll das die Spannungsversorgung sein. Hier bin ich aber sicher alles richtig gemacht zu haben. Der Arduino wird per USB vom PC versorgt. Zum Servo wird nur GND und das PWM-Signal geführt. Der Servo selbst hängt an meinem Labornetzteil an 5V mit einer Strombegrenzung bei 1,5 A, die aber nie erreicht wird. Als PWM-Ausgang am Arduino Nano haben schon Pin 8 bis 10 getestet, überall das gleiche.

Ein Befehl den Servo an eine Position zu fahren hat keinen Effekt. Wenn ich den Servo aber von Hand bewege gibt es eine Position, bei der er nicht mehr tickt. Ab dann kann ich den Servo auch mit dem Arduino steuern.

Um diese Theorie zu beweisen, habe ich beim Start des Arduino eine Routine, die langsam alle Positionen des Servos "abfährt". Der Servo tickt, bis die richtige Position erreicht ist und fährt ab dann brav mit.

Das Labornetzteil halte ich für Potent genug. Aber ich habe zum Testen auch schon mal 220µF direkt an die Versorgung des Servo gelötet. Leider ohne Erfolg.

Wer hat eine Idee, was hier die Ursache sein könnte? Zur Belustigung ein Foto meines Versuchsaufbaus:
Servo Test.jpg
von oben kommt rot + schwarz die Versorgung vom Netzteil. Bei der grünen Leitung habe ich versuchsweise das Poti im Servo angezapt, weil mich die Werte interessiert haben. Aber auch ohne diese Verbindung habe ich das Problem.

Viele Grüße
Andreas
Benutzeravatar
Bastelbruder
Beiträge: 11481
Registriert: Mi 14. Aug 2013, 18:28

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bastelbruder »

iIch könnte mir hier ein Masseproblem vorstellen. Gleichstrom? Das Servo zieht steilflankige Impulsströme aus der Versorgung, die nicht nur auf dem roten Draht zu Spannungsabfall bipolaren Spannungsimpulsen führen.
Masse bedeutet: absolut identisches Potenzial. Auch die Versorgungsspannung könnte "abgeblockt" sein, so etwa mit hundert Mikrofarad (mindestens) am Servostecker. Ich sehe hier lauter Induktivitäten, die womöglich mit Eisendraht gewickelt sind.

Früher - zu Heinz Richters Zeiten - hat das noch funktioniert. Heute sind nirgends mehr bipolare Transistoren in den ICs sondern CMOS mit Schutzdioden die die ordentliche Funktion gern unterwandern wenn man sie auch unbeabsichtigt mit Arbeit überhäuft.

Ich durfte kürzlich eine aus Maker-Zubehör zusdammengestückelte Schaltung begutachten, da ist bloß so ein Infrarot-Fernsteuerempfänger immer wieder Amok gelaufen und hat Dauersignal selber erzeugt. Weil der hundert Nano-Kondensator aus dem Datenblatt bloß 10 cm Flachstrippe und einen Steckverbinder vom Empfangs-Chip entfernt war.

Das IC von damals hab ich doch schon vor langer Zeit hier erwähnt.
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Ich glaub ich habe mich verklassifiziert, irgendwie komisch, oder ist das so korrekt?


Main.cpp

Code: Alles auswählen

#include <Arduino.h>
#include <EEPROM.h>
#include <Wire.h>
#include "akku.h"

typedef struct
{
  AKKU akku;
  int i2c_addr;
} akku_t;

akku_t DerAkku[6] = {
    {.akku = AKKU(31), 31},
    {.akku = AKKU(32), 32},
    {.akku = AKKU(33), 33},
    {.akku = AKKU(34), 34},
    {.akku = AKKU(35), 35},
    {.akku = AKKU(36), 36}

};

void setup()
{
  Wire.begin();
  Serial.begin(115200);
}

void loop()
{
delay(10);
  for (int a = 0; a < 6; a++)
  {

    DerAkku[a].akku.read(DerAkku[a].i2c_addr);
    if (!(DerAkku[a].akku.power_fail < 0 || DerAkku[a].akku.power_fail == 255))
    {
      Serial.print(" A: ");
      Serial.print(a);
      Serial.print(" fail: ");      
      Serial.print(DerAkku[a].akku.fail);
      Serial.print(" Pwr: ");
      Serial.print(DerAkku[a].akku.power_fail);
      Serial.print(" Ser: ");
      for (int b = 0; b < 8; b++)
      {
        Serial.print(DerAkku[a].akku.serial[b], HEX);
        Serial.print(" ");
      }
      Wire.beginTransmission(DerAkku[a].i2c_addr);
      Wire.write(DerAkku[a].akku.command);
      Wire.endTransmission();
      sprintf(DerAkku[a].akku.out_string, " %03u%%  ", DerAkku[a].akku.percent);
      Serial.print(DerAkku[a].akku.out_string);
      if (DerAkku[a].akku.ampere < 0)
        sprintf(DerAkku[a].akku.out_string, "%u,%02uV -%i,%02iA ", DerAkku[a].akku.voltage / 1000, (DerAkku[a].akku.voltage % 999) / 10, abs(DerAkku[a].akku.ampere) / 1000, (abs(DerAkku[a].akku.ampere) % 999) / 10);
      else
        sprintf(DerAkku[a].akku.out_string, "%u,%02uV %02i,%02iA ", DerAkku[a].akku.voltage / 1000, (DerAkku[a].akku.voltage % 999) / 10, abs(DerAkku[a].akku.ampere) / 1000, (abs(DerAkku[a].akku.ampere) % 999) / 10);
      Serial.println(DerAkku[a].akku.out_string);
     DerAkku[a].akku.command = 1;
    }
    delay(1000);
  }
}
akku.h

Code: Alles auswählen

#ifndef _AKKU_H_
#define _AKKU_H_

#include <Wire.h>

class AKKU
{
private:
    int i2c_addr;
public:
    int command;
    uint16_t voltage;
    int power_fail;
    int16_t ampere;
    uint8_t percent;
    char out_string[100];
    int serial[8];
    int fail;
    AKKU(int _AD);
    void read(int i2c_addr);
};

#endif

akku.cpp

Code: Alles auswählen

#include "akku.h"
#include <Arduino.h>

AKKU::AKKU(int _AD){
    i2c_addr=_AD;
    Wire.begin(i2c_addr);
}

    void AKKU::read(int ic2_addr)
    {   
       
        byte a, b;
        Wire.requestFrom(ic2_addr, 15);// 16 Byte empfangen
        percent = Wire.read(); //0
        b = Wire.read();//1
        a = Wire.read();//2
        ampere = a;
        ampere = ampere << 8 | b;
        b = Wire.read();//3
        a = Wire.read();//4        
        voltage = a;
        voltage = voltage << 8 | b;        
        power_fail = Wire.read();//5
        //Serial.print("Power: ");
        //Serial.print(power_fail);
        //Serial.print(" Serial: ");
        for (int a = 0; a < 8; a++)
        {
            serial[a] = Wire.read();//6-13
          //  Serial.print(serial[a], HEX);
          //  Serial.print(" ");
        }
        
       fail = Wire.read();//14
    }
virtexultra
Beiträge: 127
Registriert: So 9. Dez 2018, 11:30

Re: Der AVR-/ARDUINO-Faden

Beitrag von virtexultra »

Hightech hat geschrieben: Sa 18. Feb 2023, 17:49 Ich glaub ich habe mich verklassifiziert, irgendwie komisch, oder ist das so korrekt?
Folgene Dinge sind mir aufgefallen:

Du schleppst die i2c Addr. noch mal extra in einem Strukt mit, obwohl du diese im Konstruktor übergeben hast. Ich vermute weil du es später für Wire.beginTransmission benötigst. Würde ich eine Getter Funktion schreiben und diese Information nur in der Klasse Akku speichern (oder wie später genannt komplett in die Klasse verlagern)

Code: Alles auswählen

if (!(DerAkku[a].akku.power_fail < 0 || DerAkku[a].akku.power_fail == 255))
ist für mich Code der zur Auswertung des Akkus gehört und somit auch in die dazugehörige Klasse. Also z.B. eine Klassenfunktion .powerFail() die dann die Variable power_fail überprüft. Hier passt aber auch was mit den Datentypen nicht. Wire.read() sollte ein Byte zurückliefern - vermutlich ist das als uint8_t definiert und wird somit nie < 0.

Ein Flag / Zeitstempel das überprüft ob/wann der Akku schon/das letzte Mal ausgelesen wurde. Nicht das irgendwer Akku::read erst nach dem Überprüfen eines Zustandes aufruft.

Warum das I2C Read in die Klasse integrieren und das Schreiben aber nicht? Falls die Logik mit den verschiedenen Schreibcommands ausartet kann man ja auch ::write(uint8_t cmd) als Funktion der Klasse einbauen. Es scheint auch nur das command "1" zu geben, also kann der Wert auch in den Konstruktor der Klasse.

Ich frage mich was in der ersten Runde für ein cmd an den Akku gesendet wird. Wenn du Glück hast wird der Speicher in dem die Klasse später liegt mit 0 geinit, ansonsten könnte das alles sein.

Das sind jetzt aber alles keine wirklich entscheidenden Sachen und ich sehe bis aus den letzten Punkt nichts funktionsentscheidendes.
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Danke schon man,
das command ist erst ein mal nur die Freigabe das der Akku starten soll, ist command 0, dann sendet der client keine Can-Nachichten an den Akku, dann geht die Spannung dort aus.
Besser wäre dann sicher akku.power_off() / akku.power_on()
ch_ris
Beiträge: 3029
Registriert: Mo 30. Nov 2015, 10:08

Re: Der AVR-/ARDUINO-Faden

Beitrag von ch_ris »

Wire.begin im Akku Konstruktor verstehe ich nicht.
Ist das ein Singleton oder sollte spätestens jetzt einer sein? oder egal?
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Wer es noch nicht weiß:
Einen Arduino kann man auch über das Netzwerk flashen, wenn man es über USB/Bootloader tut.
Einfach einen Raspi ans Netzwerk, über USB den Arduino dran und vom Hauptrechner dann über usbip den Arduino bedienen.

https://www.net-usb.com/de/usb-over-ip-raspberry-pi/
Bumbum
Beiträge: 280
Registriert: Mi 22. Apr 2015, 19:04

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bumbum »

Hallo,

ich würde gerne ein größeres Arduino-Projekt zur besseren Übersicht in mehrere Dateien aufteilen. Aber ich bekomme es nicht hin. Hier ein kleines Beispiel für meinen Test-Sketch:

Code: Alles auswählen

#include <TFT_eSPI.h>

TFT_eSPI display = TFT_eSPI ();

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}
Dann habe ich eine Datei "Display.c" zum Projekt hinzugefügt:

Code: Alles auswählen

#include <TFT_eSPI.h>

extern TFT_eSPI display = TFT_eSPI ();
Die Datei wird mir in der Arduino IDE oben in den Tabs angezeigt. Aber das compilieren klappt mit diesem kleinen Beispiel nicht. In der Zeile:

Code: Alles auswählen

extern TFT_eSPI display = TFT_eSPI ();
erhalte ich die Fehlermeldung "Fehler: unknown type name 'TFT_eSPI'"

Wie macht man es richtig?

Viele Grüße
Andreas
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Oh,
da fehlen die Grundlegegenden Basics der Programmierung.

Da müssen wir ganz unten anfangen.
Man kann Funktionen und Klassen in Dateien auslagern. Dazu muss man aber auch die Unterschiede kennen und wie man Funktionen und Klassen benutzt und schreibt.

Vielleicht wäre ein Anfänger Tutorial zur Arduino programmierung gut.
Bumbum
Beiträge: 280
Registriert: Mi 22. Apr 2015, 19:04

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bumbum »

Hallo Hightech,

ich habe die Ursache in der Zwischenzeit herausgefunden: Die Datei darf nicht die Endung .c haben, sonder muss .ino heißen.

Viele Grüße
Andreas
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Bumbum hat geschrieben: Mi 22. Mär 2023, 21:44 Hallo Hightech,

ich habe die Ursache in der Zwischenzeit herausgefunden: Die Datei darf nicht die Endung .c haben, sonder muss .ino heißen.

Viele Grüße
Andreas
Wie ? ist ja mal seltsam. Komische Sachen gibt es. Schön das es geklappt hat.
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

ESP32 low Power wakeup

Beitrag von Hightech »

Moin, wie sogt man sinnvollerweise bei einem ESP32 dafür, das der regelmäßig und zuverlässig aufwacht um zu arbeiten und dann wieder schlafen zu legen.
Dabei soll er im Schlaf wenig Strom verbrauchen.
Beim Atmel gibt es ja meistens einen unabhängigen Zähler mit externem Quarz für diesen Zweck.
Hat hier jemand sowas mit dem ESP32 gemacht?
MSG
Beiträge: 2182
Registriert: Fr 9. Nov 2018, 23:24
Wohnort: Nähe Dieburg

Re: Der AVR-/ARDUINO-Faden

Beitrag von MSG »

Andreas Spiess hatte da ein gutes Video dazu gemacht

https://youtu.be/JFDiqPHw3Vc

Im Moment laufen meine Esp32 alle ohne Schlaf
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Gibts es das auch ohne YT, ich mag keine Erklärvideos.
Die kann man nicht querlesen.....
berferd
Beiträge: 1327
Registriert: Mi 3. Apr 2019, 23:45

Re: Der AVR-/ARDUINO-Faden

Beitrag von berferd »

Anderes Thema: obacht beim Arduino Pro Mini, möglicherweise auch bei anderen: die Dinger brauchen 2-3 Sekunden bis sie an der ersten Zeile Code ankommen. Ursache ist laut Netzrecherche der Bootloader, vermute das ist die Zeit die einem das Eingreifen zum Flashen über die serielle Schnittstelle erlaubt. Kann man natürlich wieder irgendwie umflashen usw, zerstört aber den Charme des "Projekt mal schnell eben" (für Ernsthafteres macht man ja ohnehin eigene eigene Platine mit ICSP-Stecker).
MSG
Beiträge: 2182
Registriert: Fr 9. Nov 2018, 23:24
Wohnort: Nähe Dieburg

Re: Der AVR-/ARDUINO-Faden

Beitrag von MSG »

Hightech hat geschrieben: So 9. Apr 2023, 20:06 Gibts es das auch ohne YT, ich mag keine Erklärvideos.
Die kann man nicht querlesen.....
Die vom Andreas sind eigentlich ganz gut zum drüber schauen.

Ansonsten findest du hier noch ein paar Infos

https://smarthome-blogger.de/blog/esp32 ... deep-sleep

https://www.azdelivery.de/blogs/azdeliv ... tzenklappe
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Danke für die Links!
IPv6
Beiträge: 2166
Registriert: Fr 17. Mär 2017, 22:05

Re: Der AVR-/ARDUINO-Faden

Beitrag von IPv6 »

berferd hat geschrieben: So 9. Apr 2023, 20:13 Anderes Thema: obacht beim Arduino Pro Mini, möglicherweise auch bei anderen: die Dinger brauchen 2-3 Sekunden bis sie an der ersten Zeile Code ankommen. Ursache ist laut Netzrecherche der Bootloader, vermute das ist die Zeit die einem das Eingreifen zum Flashen über die serielle Schnittstelle erlaubt. Kann man natürlich wieder irgendwie umflashen usw, zerstört aber den Charme des "Projekt mal schnell eben" (für Ernsthafteres macht man ja ohnehin eigene eigene Platine mit ICSP-Stecker).
Du könntest auch einfach alle deine Arduino Pro Minis (oder Nanos oder oder oder) mit dem Optiboot Bootloader flashen, dauert nur ein paar Sekunden und hat anschließend keine Wartezeit beim starten mehr. Ist aber trotzdem weiterhin über die serielle Schnittstelle flashbar.
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Nochmal deep-Sleep Thema

Beitrag von Hightech »

Es scheint ja Probleme mit dem Deep-Sleep Modus zu geben, das der manchmal nicht wieder aufwacht.
So meine Idee jetzt :

Nach getaner Arbeit die Schaltung über einen Impuls in den Zustand "Aus" bringen. Dann wird ein Kondensator geladen.
Wenn der Kondensator weit genug geladen ist schaltet ein Fet der an diesem Kondensator hängt, die Schaltung wieder ein
So 1MOhm an 1000µF.
Wären 5µA Standby Strom

Macht das irgendwie Sinn?
Bumbum
Beiträge: 280
Registriert: Mi 22. Apr 2015, 19:04

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bumbum »

Hallo,

kennt sich hier jemand mit Cache-Control Header aus? Ich habe in einem Arduino mit ESP32 einen WebServer:

Code: Alles auswählen

#include <WebServer.h>
WebServer server (HTTP_port);
Bei diesem definiere ich diverse Dateien, unter anderem auch Bilder. z.B.:

Code: Alles auswählen

server.on (FavIcon_ico_path,            [&]() { webserver_handle_binary (FavIcon_ico_name, FavIcon_ico_content_type, FavIcon_ico_size, FavIcon_ico_data); });
Die Binären Dateien, bzw. Bilder liefere ich dann so aus:

Code: Alles auswählen

void webserver_handle_binary (String filename, String content_type, size_t filesize, const char *content)
{
  String header = "";
  header += F ("HTTP/1.1 200 OK\r\n");
  //header += F ("Last-Modified: Mon, 10 April 2023 00:00:00 GMT\r\n");
  header += F ("cache-control: max-age=604800\r\n");
  header += F ("content-Type: ");
  header += content_type;
  header += F ("\r\n");
  header += F ("content-Length: ");
  header += String (filesize);
  header += F ("\r\n");
  header += F ("\r\n");

  server.sendHeader (filename, header, false);
  //server.setContentLength (filesize);
  server.sendContent (content, filesize);
}
Allerdings klappt das nicht. Im Browser werden die Dateien nicht "gecached". Dies habe ich in den Entwickler-Tools des Browsers geprüft und die Dateien werden auch jedes mal tatsächlich neu geladen.
Weiß jemand, was hier schief läuft? Die auskommentierten Zeilen habe ich beide schon einzeln und zusammen versucht. Und ich habe "Cache-Control" auch schon mit dem ersten Buchstaben groß geschrieben.
In einen Meta-Header-Tag kann ich den Cache-Control, nicht packen, da es den bei Bildern ja nicht gibt.

Viele Grüße
Andreas
Benutzeravatar
ferdimh
Beiträge: 9379
Registriert: Fr 16. Aug 2013, 15:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von ferdimh »

Hightech: Zum Zwangsaufwecken ist diese Schaltung ein bisschen problematisch, weil der Eingang dabei, bevor das Ding erwacht, den Linearbereich durchläuft. Dabei wird das Ding mächtig Strom für einige Zeit (5mA oder so) ziehen.

ein 4541 Langzeittimer könnte geeigneter sein, allerdings halten sich die Hersteller hier bedeckt, wie viel Strom das Ding in der Praxis braucht. Auf jeden Fall braucht der Oszillator dann Widerstände im MΩ-Bereich.

Bastelbruder würde ich zutrauen, die Stromaufnahme zu kennen
Jannyboy
Beiträge: 1406
Registriert: So 11. Aug 2013, 14:49
Wohnort: Kreis Augsburg

Re: Der AVR-/ARDUINO-Faden

Beitrag von Jannyboy »

Der Deep-Sleep hat nur eine Macke wenn der timer auf den internen 150kHz RC Oszillator läuft.
Den kann mal auch auf einen 32kHz Uhrenquarz laufen lassen. Dann sollte der ohne Probleme gehen.
Mit dem idf-Framework muss man nur ein Compiler-Switch ändern. Bei der Arduino SDK ist es aufwendiger. Die muss mit den richtigen Switchs neu kompiliert werden und ist dann nur noch mit Uhrenquarz verwendbar.

Grüße Jan
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Den externen Quarz kann man hier einfach einschalten?
https://docs.espressif.com/projects/esp ... tc-clk-src
Benutzeravatar
ProgBernie
Beiträge: 584
Registriert: Fr 16. Sep 2022, 21:59
Wohnort: Zwischen Hamburg und Haiti ^W Lübeck

Re: Der AVR-/ARDUINO-Faden

Beitrag von ProgBernie »

Von den LGT8F328P "MiniEVB" auf einem Nano hatte ich ja schon berichtet. Die sind mit dem Takt gut doppelt so schnell wie "normale" Nanos.
Wenn die Pins zu Ende gehen: Einfach einen "Arduino" mit mehr Beinen nehmen. Hier einer im Formfaktor DIL-40.
Aus reinstem Chinesium ist der aufgebrachte Käfer, ebenfalls ein LGT8F328P, aber im LQFP-48-Gehäuse:

https://www.aliexpress.com/item/4000151967508.html

Für die üblichen Bastelaufgaben tun die gut. Einbindung in Platformio ist auch nicht schwer.
Jannyboy
Beiträge: 1406
Registriert: So 11. Aug 2013, 14:49
Wohnort: Kreis Augsburg

Re: Der AVR-/ARDUINO-Faden

Beitrag von Jannyboy »

Hightech hat geschrieben: Do 13. Apr 2023, 07:09 Den externen Quarz kann man hier einfach einschalten?
https://docs.espressif.com/projects/esp ... tc-clk-src
Kann man machen... man kann auch den OSC umschalten. Nur dann geht nichts mehr, da alle Timer und die RTC um Faktor 4.7 zu langsam laufen.
Der verantwortliche Interruptvector ist im Code per Compiler-Switch hardcodiert.
Rate mal woher ich das weiß :roll:

Edit: Die IDF4.4 hat ein Workaround für den Deep-Sleep Bug mit den RC-Oszillator. Ab Hardware Revision 3 ist der Fehler im Silizium behoben.

Grüße Jan
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

ArduServo

Beitrag von Hightech »

Moin,
ich habe hier DC-Motoren mit Encoder drauf, 512 Pulse pro Umdrehung.
Hat das schonmal jemand am Arduino gemacht?
Es gibt die Encoder-Lib und die Servo-Lib.
Die Servolib ist nur für fertige Servos.
Die Encoder nur für den Encoder.
Was fehlt ist der Servo-Regler.

Ich habe ein Signal von -1000 bis +1000 welches ich dann als Position am Servo haben möchte.
Also im Prinzip
Motor start bis der Zähler des Encoders die Position bsp. 500 Schitte erreicht hat, dann stop.
dann immer eine Differenz und die Anzahl Schritte in die Richung.
Aber das ist ja nicht so toll
Mann muss ja eine gewisse Rampe fahren,
Das gibt es doch sicher fertig?
frickelfred56
Beiträge: 230
Registriert: Mo 16. Feb 2015, 13:50

Re: Der AVR-/ARDUINO-Faden

Beitrag von frickelfred56 »

Moin auch

die EncoderLib gibt ja die Absolute Position aus.
daraus und der sollposition die Differenz durch einen PID mölern.
das Ergebnis auf einen H-Brückentreiber ,zB BT7960, (gibt ne LIB) und fertig ist die Geschichte.

die Rampe macht im Idealfall der PID

Gruß Frickelfred
Benutzeravatar
Alexander470815
Beiträge: 2371
Registriert: So 11. Aug 2013, 15:42
Wohnort: D:\Hessen\Gießen

Re: Der AVR-/ARDUINO-Faden

Beitrag von Alexander470815 »

Wenn die Performance gut werden soll muss man mehrere Regler ineinander verschachteln und entsprechend parametrieren.
Lageregler->Drehzahlregler->Stromregler
Von langsam nach schnell.
Alles mit einem Regler auszuregeln funktioniert nur mäßig gut.
Den Stromregler kann man vielleicht noch weg optimieren da der schon einiges an Bandbreite braucht aber Eine Störgrößenaufschaltung auf das Stellsignal in Abhängigkeit der Drehzahl sollte schon sein um den Gegen-EMK des Motors zu kompensieren.
Wenn der Regler mit Sollwertsprüngen zurechtkommen soll muss man den sehr lahm parametrieren damit er nicht überschießt.
Besser wäre es die Rampen davor zu erzeugen so das er keine Sprünge ausregeln muss.

Man muss auch schauen wie die encoder lib arbeitet, für einen Drehencoder den man per Hand dreht ist die Geschwindigkeit kein Problem.
Bei 512 Pulsen pro Umdrehung und ein paar tausend U/min muss das schon entsprechend schnell arbeiten sonst kommt da nur Müll raus.

Ich habe sowas mal mit einem 328P gebaut und den Encoder an die beiden Interrupt Eingänge angeschlossen um somit direkt bei Pegel Änderungen den Zählerstand zu aktualisieren.
Für prellende mechanische Encoder ist sowas jedoch nichts(falls man sowas da dran anklemmen würde).
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Treiber ist ein L298 (oder so? HBrücke)
Leider ist der Encoder am Motor, nicht am Getriebe.

Ich schau mal nach ner schnellen Encoder Lib.
ch_ris
Beiträge: 3029
Registriert: Mo 30. Nov 2015, 10:08

Re: Der AVR-/ARDUINO-Faden

Beitrag von ch_ris »

guck mal, vielleicht ist die was: https://github.com/brianlow/Rotary
hatte ich vor längerem probiert mit PinChangeInt zusammen.
allerdings nur ein Test mit nur dem Encoder dran.
Benutzeravatar
ferdimh
Beiträge: 9379
Registriert: Fr 16. Aug 2013, 15:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von ferdimh »

Ich habe tatsächlich feststellen müssen, dass es bei kleinen Motoren auch noch ganz gut mit Drecksau-PID über die ganze Regelstrecke geht.
Die Gegen-EMK des Motors verursacht zwar einen Fehler, aber dieser hat ein unproblematisches Vorzeichen. Die Induktivität des Motors ist eher ein Arschloch, aber bei Kleinmotoren im Vergleich zum Widerstand nicht so groß. Wenn die Motoren in kg gemessen werden, wird das potentiell zum Problem.
Wichtig ist, die PWM-Frequenz hoch genug zu wählen, dass auch wirklich eine Glättung an der Motorinduktivität passiert, und man nicht nur die Heizleistung in den Wicklungen moduliert. Das heißt 5kHz oder mehr (wenn Menschen in der Nähe sind, bitte 16-20 sonst AUA MEINE OHREN).

Am Ende wird das Ganze deutlich weniger Performance haben als ein "echter" Kaskadenregler. Aber es ist immer noch ausreichend, dass die damit gebaute Käsefräse nicht an den Antrieben sondern an der mechanischen Stabilität an die Grenzen kommt...
Wir haben das damals (tm) aber mit STM32 gemacht; da gibts welche mit Hardwareencoderauswerter.
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Pin invertieren für eine Funktion

Beitrag von Hightech »

Moin,
ich muss für eine stepper Funktion den Enable-Pin invertieren.
Wie mache ich das?

#define enablePinStepper1 0

setup:
stepper1->setEnablePin(enablePinStepper1);
unlock
Beiträge: 632
Registriert: Sa 31. Dez 2016, 20:21

Re: Der AVR-/ARDUINO-Faden

Beitrag von unlock »

enable = !notenable
virtexultra
Beiträge: 127
Registriert: So 9. Dez 2018, 11:30

Re: Der AVR-/ARDUINO-Faden

Beitrag von virtexultra »

Ich habe irgendwie nicht gelesen welche Lib du nutzt. Ich vermute mal FastAccelStepper von https://github.com/gin66/FastAccelStepper.

Hier hat der Aufruf setEnablePin() einen zweiten bool Parameter der beschreibt ob der Pin invertiert ist.

Also für einen Active Low Enable: stepper1->setEnablePin(enablePinStepper1, true);

Nutzt du AccelStepper http://www.airspayce.com/mikem/arduino/AccelStepper/ gibt es einen extra Aufruf

void setPinsInverted (bool directionInvert=false, bool stepInvert=false, bool enableInvert=false)
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

TOP! Danke.
Ewig gesucht, nix gefunden.
Bumbum
Beiträge: 280
Registriert: Mi 22. Apr 2015, 19:04

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bumbum »

Hallo,

ich versuche seit gestern Abend das erste mal SPIFFS für meinen ESP32 Arduino zu verwenden. Alle Beispiele, die ich online finde sind ungefähr gleich. Trotzdem kann ich das nicht kompilieren und ich finde dazu per Suchmaschine keine Abhilfe. Vielleicht hat hier jemand eine Idee? Hier mal mein Sketch:

Code: Alles auswählen

#define FORMAT_SPIFFS_IF_FAILED true

#include "FS.h"
#include "SPIFFS.h"

void setup ()
{
  
  if (SPIFFS.begin (true))
  {
       File root = SPIFFS.open ("/"); 	//Compilation error: 'File' was not declared in this scope
      if (file)
      {
        //...
      }
      //else
  }
  //else
}
Viele Grüße
Andreas
Anse
Beiträge: 2278
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Der AVR-/ARDUINO-Faden

Beitrag von Anse »

Und die Fehlermeldung lautet wie?
Benutzeravatar
Weisskeinen
Beiträge: 3942
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Ich würde annehmen

Code: Alles auswählen

Compilation error: 'File' was not declared in this scope
Anse
Beiträge: 2278
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Der AVR-/ARDUINO-Faden

Beitrag von Anse »

'File' sollte da sein. Aber warum oben 'root' definiert wird und unten 'file' geprüft wird ist seltsam.
Benutzeravatar
Weisskeinen
Beiträge: 3942
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Stimmt eigentlich. Ich lese das so, dass 'root' vom Typ 'File' ist. Aber was ist 'file' und welchen Typ hat das? Und wo wird das deklariert? Und wo gesetzt?
ch_ris
Beiträge: 3029
Registriert: Mo 30. Nov 2015, 10:08

Re: Der AVR-/ARDUINO-Faden

Beitrag von ch_ris »

quatsch stand hier
virtexultra
Beiträge: 127
Registriert: So 9. Dez 2018, 11:30

Re: Der AVR-/ARDUINO-Faden

Beitrag von virtexultra »

Probiere mal den explizit den namespace anzusprechen.

Also File root => fs::File root

Ansonsten würde ich sagen das dort eine unpassenden Version von FS.h eingebunden wird. In https://github.com/espressif/arduino-es ... S/src/FS.h ist die Klasse File direkt definiert.
Bumbum
Beiträge: 280
Registriert: Mi 22. Apr 2015, 19:04

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bumbum »

Hallo,
Weisskeinen hat geschrieben: Mi 14. Jun 2023, 12:59 Ich lese das so, dass 'root' vom Typ 'File' ist. Aber was ist 'file' und welchen Typ hat das?
Hier muss ich mich entschuldigen. Diese Verwechslung ist aus den ganzen Copy & Paste Beispielen vom Internet entstanden. Natürlich müssen entweder beide "root" oder beide "file" heißen. Der Fehler war aber tatsächlich der "Compilation error: 'File' was not declared in this scope". (Also File groß geschrieben)
virtexultra hat geschrieben: Mi 14. Jun 2023, 13:28 File root => fs::File root
Das hat geholfen. Vielen Dank für diesen Tipp! Da wäre ich nie drauf gekommen. Nur der Vollständigkeit halber und um vielleicht noch etwas mehr zu lernen: Hat jemand eine Idee, was hier bei mir schief läuft?

Viele Grüße
Andreas
ch_ris
Beiträge: 3029
Registriert: Mo 30. Nov 2015, 10:08

Re: Der AVR-/ARDUINO-Faden

Beitrag von ch_ris »

File ist eine Klasse.
root ein Objekt vom typ File.
(root könnte noch ein Schlüsselwort sein, verwendung solcher führt zu komische Effekten?)
normal macht man's ja so:

import FS.h // bringt File mit
File rooot; // deklaration
void setup(){
rooot= konstruktorAufruf();//definition

oder wenn's zulässig ist deklaration und definition in einem, dann aber im globalen Namespace, nicht in einer Methode.
oder halt wie jetzt explizit/statisch (fs::methode) als allerletzter Notnagel.
meine c++ Ahnung hält sich auch in grenzen, bitte um Berichtigung.
virtexultra
Beiträge: 127
Registriert: So 9. Dez 2018, 11:30

Re: Der AVR-/ARDUINO-Faden

Beitrag von virtexultra »

Füge doch mal

Code: Alles auswählen

#define FS_NO_GLOBALS DEADBEEF
irgendwo in den Code ein. Es gab in älteren Versionen von Arduino das Problem das die Klasse File von mehreren Dateisystemimplementierungen (SPIFFS, SD-Card) bereitgestellt wurde und diese nicht zusammengepasst haben. Mit dem define wird der Export der File Klasse in den globalen Namespace unterbunden und somit macht es die explizite Benennung des Namespace notwendig.

Ist FS_NO_GLOBALS bereits wo anders definiert sollte der Compiler mit mindestens einer Warnung antworten. Dann solltest du suchen wo dieses Define herkommt.
Zuletzt geändert von virtexultra am Sa 17. Jun 2023, 17:53, insgesamt 1-mal geändert.
Bumbum
Beiträge: 280
Registriert: Mi 22. Apr 2015, 19:04

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bumbum »

Hallo,
virtexultra hat geschrieben: Do 15. Jun 2023, 09:11 Es gab in älteren Versionen von Arduino das Problem das die Klasse File von mehreren Dateisystemimplementierungen (SPIFFS, SD-Card) bereitgestellt wurde und diese nicht zusammengepasst haben
Ich nutze die IDE 2.1.0. Wenn ich FS.h nicht include kommt die gleiche Meldung. Den Namen root habe ich auch mal testweise zu Erdbeeren geändert, auch kein Erfolg. Und:

Code: Alles auswählen

#define FS_NO_GLOBALS DEADBEAF


Bringt ebenfalls die gleiche Fehlermeldung. Ich nutze einige Bibliotheken, aber bisher keine von der ich vermuten würde eine File Klasse zu beinhalten. Gibt es eine Möglichkeit das rauszufinden?

Viele Grüße
Andreas
ch_ris
Beiträge: 3029
Registriert: Mo 30. Nov 2015, 10:08

Re: Der AVR-/ARDUINO-Faden

Beitrag von ch_ris »

Das ist ein Vorteil einer IDE, da kann man suchen wer File oder irgendwas wo verwendet.

Hab auch eine Frage.
in der pins_arduino.h von attinycore steht:

Code: Alles auswählen

#define TIMER_TO_USE_FOR_MILLIS                  0
ich möchte das nicht dort ändern sondern in meinem eigenen code:

Code: Alles auswählen

#undef TIMER_TO_USE_FOR_MILLIS
#define TIMER_TO_USE_FOR_MILLIS  1;
das gibt aber gemecker beim bauen:
(.text+0x0): multiple definition of `__vector_5'
.\sloeber.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
make: *** [makefile:81: Tacho.elf] Error 1
"E:/Tools/eclipseSloeber4.4/arduinoPlugin/tools/make/make all" terminated with exit code 2. Build might be incomplete.
geht das nicht oder kann ich da was machen?
virtexultra
Beiträge: 127
Registriert: So 9. Dez 2018, 11:30

Re: Der AVR-/ARDUINO-Faden

Beitrag von virtexultra »

Ich glaube nicht das das ein sinnvoller Ansatz ist. Vermutlich werden nun Teile des Codes mit dem Wert 0 für TIMER_TO_USE_FOR_MILLIS gebaut und andere mit 1, je nachdem welcher Header zuerst kommt/eingebunden ist.

Ich würde aus dem Code in pins_arduino.h ein

Code: Alles auswählen

#ifndef TIMER_TO_USE_FOR_MILLIS
#define TIMER_TO_USE_FOR_MILLIS 0
#endif
machen und dann per Compileroption (-D bei gcc) den Wert anpassen.
Antworten