Show Posts
Pages: [1] 2 3 ... 9
1  International / Deutsch / Re: 2 Arduinos an einem PC (com fest zuweisen) on: June 23, 2014, 01:59:36 am
Wenn du die Arduino IDE ein zweites mal startest, bleibt der ausgewählte COM-Port in den Fenstern so wie eingestellt. Das war doch die Frage, oder?
2  International / Deutsch / Re: 433Mhz Funksteckdosen mit Learn Funktion on: June 08, 2014, 03:27:08 am
Sicher, dass man irgend eine beliebige Fernbedienung nehmen kann bzw. einen beliebigen Code senden kann? Die Funkdosen werden nämlich auch mit Fernbedienung verkauft, welche man auch anlernen muss.
Bedienungsanleitung siehe z.B. hier https://www.yumpu.com/de/document/view/2761774/bedienungsanleitung-chilitec-gmbh

Ich denke, man muss sich da schon an ein bestimmtes Protokoll halten, und das muss man erstmal heraus finden...
3  International / Deutsch / Re: Problem mit Taster entprellen on: June 06, 2014, 04:46:57 pm
Mhh das war mir nun vom Verständnis her zu schwierig, nach ein bisschen rumprobieren ist mir aber noch was anderes eingefallen, ich hab jetzt ganz einfach ein delay() in der loop eingefügt. Nun habe ich folgende Logik:

Tastendruck löst Interrupt aus und Flag wird gesetzt
-> If-Schleife in der Loop wird umgehend ausgeführt
-> am Ende der if-Schleife noch ein kurzes delay() und erst zum Schluss das Flag wieder auf 0 setzen

Dadurch wird beim Drücken einer Taste diese nun sofort erkannt, das Prellen stört aber nicht solange die if-Schleife noch abgearbeitet wird.
Ein Counter in der ISR funktioniert so nicht, dieser war aber auch nur für Testzwecke da. Ich denke das ist eine ganz passable Lösung welche ganz gut funktioniert, es sei den jemand hat 'nen besseren Vorschlag  smiley

Vollständigkeit halber noch den Sketch hierfür. Um Strom zu sparen kann man anstatt dem delay() auch den µC noch kurz schlafen legen. Habe somit eine 6-Tasten Fernbedienung die nur ein paar µA benötigt, solange keine Taste gedrückt wird  smiley-razz

Code:
#include <LowPower.h>      // für powerDown des µC's

volatile byte IRQ0PrevVal = 0;     // Contact level last IRQ0
volatile byte IRQ1PrevVal = 0;     // Contact level last IRQ1

volatile byte Taste = 255;         // 255 entspricht nicht aktiv
volatile int irqFlag = 0;          // 1=display counters after IRQ; 0=do nothing

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

  // Tastereingänge definieren und Pull-Up Widerstand aktivierten
  pinMode(A0, INPUT);
  digitalWrite(A0, HIGH);
  pinMode(A1, INPUT);
  digitalWrite(A1, HIGH);

  PCICR |= (1 << PCIE1);             // Set port bit in CICR for INT3 and INT4
  PCMSK1 |= (1<<PCINT8);             // Set pin interrupt for INT4
  PCMSK1 |= (1<<PCINT9);             // Set pin interrupt for INT4

  interrupts();                      // Enable interrupts
  Serial.println("Waiting for an interrupt...");
  Serial.flush();                    // Serielle Ausgabe beenden vor powerDown
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
}


void loop()
{
  // Wird nach Interrupt ausgeführt
  if (irqFlag==1 && Taste!=255)                   // Flag was set by IRQ routine
  {
    Serial.print("Button pressed: A");
    Serial.println(Taste);
    Taste = 255;
    delay(100);   
    irqFlag=0;                      // Reset IRQ flag
  }
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);    // ATmega wieder schlafen legen
}

//Interrupt-Funktion
ISR(PCINT1_vect)
{
  // You have to write your own interrupt handler. Don't change the name!
  // This code will be called anytime when PCINT23 switches high to low,
  // or low to high. This is for INT3 and INT4 (both Port C)
  byte PVal;                                   // Port value (8 Bits)
  byte IRQ0ActVal;                             // Actual IRQ0 value
  byte IRQ1ActVal;                             // Actual IRQ3 value

  PVal = PINC;                                 // Read port C (8 bit)
  IRQ0ActVal = PVal & (1<<PCINT8);             // Mask out all except IRQ3
  IRQ0ActVal = IRQ0ActVal >> PCINT8;           // shift to right for bit0 position
  IRQ1ActVal = PVal & (1<<PCINT9);            // Mask out all except IRQ4
  IRQ1ActVal = IRQ1ActVal >> PCINT9;          // shift to right for bit0 position
 
  // für A0-Interrupt
  if(IRQ0PrevVal==0 && IRQ0ActVal==1)        // Transition 0-->1
  {
    // Place your command for rising signal here...
    IRQ0PrevVal=IRQ0ActVal;
  }
  else if(IRQ0PrevVal==1 && IRQ0ActVal==0)        // Transition 1-->0
  {
    // Place your command for falling signal here...
    IRQ0PrevVal=IRQ0ActVal;
    Taste = 0;
    irqFlag=1;   
  }

  // für A1-Interrupt
  else if(IRQ1PrevVal==0 && IRQ1ActVal==1)        // Transition 0-->1
  {
    // Place your command for rising signal here...
    IRQ1PrevVal=IRQ1ActVal;
  }
  else if(IRQ1PrevVal==1 && IRQ1ActVal==0)        // Transition 1-->0
  {
    // Place your command for falling signal here...
    IRQ1PrevVal=IRQ1ActVal;
    Taste = 1;
    irqFlag=1;
  } 
}
4  International / Deutsch / Re: Problem mit Taster entprellen on: June 06, 2014, 01:00:44 pm
Mein Sketch basiert auf dem von der Kriwanek-Seite und ich hatte Anfangs auch das Entprellen über den Timer drin. Das Problem ist jedoch, das ein Tastendruck erst nach der Entprellzeit übernommen wird. Das bedeutet, wenn der Taster nur kurz angetippt wird dann passiert eventuell gar nichts...

Das mit dem delayMicroseconds() werde ich nachher mal testen, danke für den Tipp. Ich hatte auch versucht den Interrupt zu deaktivieren während der if-Abfrage in der loop und dort noch ein delay() einzubauen, aber ich bekomme den Interrupt danach nicht mehr zum Laufen.
Funktioniert noInterrupt() und interrupt() nicht zusammen mit dem PinChange oder gibt es noch einen anderen Befehl?

Notfalls würde ich hardwaremäßig entprellen, hab leider nur schon alles zusammen gelötet  smiley-slim Am einfachsten mit 'nem Widerstand und Kondensator, oder?
5  International / Deutsch / Problem mit Taster entprellen on: June 06, 2014, 05:56:23 am
Hallo Leute,
ich habe mir eine Fernbedienung gebastelt und verwende den PinChange-Interrupt, um den ATmega aus dem Tiefschlaf zu holen. Danach wird eine bestimmte Aktion durchgeführt und der µC wieder schlafen gelegt. Klappt eigentlich ganz gut, nur manchmal kommt der Tastendruck mehrfach an, d.h. das Entprellen klappt irgendwie nicht.

-> Im Beispiel sind zwei Taster an A0 und A1 angeschlossen. Status wird geprüft (1>0 oder 0>1) und nach einem delay ein Flag in der Interrupt-Routine gesetzt.
Irgendwie wird das delay in der Interrupt-Routine ignoriert, selbst wenn ich den Wert z.B. auf 2 Sekunden setze, kann ich schnell hintereinander den Taster drücken. Muss der Interrupt mit noInterrupt() deaktiviert werden? Hat irgendwie auch nicht geklappt...

Mein Wunsch wäre es, dass beim Drücken einer Taste die Aktion sofort ausgeführt wird und weitere Tastendrücke für ein paar Millisekunden zu sperren, um das Prellen zu ignorieren. Letztendlich wie eben eine Fernbedienung funktioniert smiley
Jemand eine Idee?

Code:
#include <LowPower.h>      // für powerDown des µC's

volatile byte counter0 = 0;        // Counter incremented by pin change interrupt
volatile byte counter1 = 0;        // Counter incremented by pin change interrupt
volatile byte IRQ0PrevVal = 0;     // Contact level last IRQ0
volatile byte IRQ1PrevVal = 0;     // Contact level last IRQ1

volatile int irqFlag = 0;             // 1=display counters after IRQ; 0=do nothing
volatile byte bounceTime  = 2000;     // Switch bouncing time in milliseconds

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

  // Tastereingänge definieren und Pull-Up Widerstand aktivierten
  pinMode(A0, INPUT);
  digitalWrite(A0, HIGH);
  pinMode(A1, INPUT);
  digitalWrite(A1, HIGH);

  PCICR |= (1 << PCIE1);             // Set port bit in CICR for INT3 and INT4
  PCMSK1 |= (1<<PCINT8);             // Set pin interrupt for INT4
  PCMSK1 |= (1<<PCINT9);             // Set pin interrupt for INT4

  interrupts();                      // Enable interrupts
  Serial.println("Waiting for an interrupt...");
  Serial.flush();                    // Serielle Ausgabe beenden vor powerDown
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
}


void loop()
{
  // Wird nach Interrupt ausgeführt
  if (irqFlag==1)                   // Flag was set by IRQ routine
  {
    Serial.print("A0: ");
    Serial.print(counter0);
    Serial.print(", A1: ");
    Serial.println(counter1);   
    irqFlag=0;                      // Reset IRQ flag 
    Serial.flush();                 // Serielle Ausgabe beenden vor powerDown
  }

  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);    // ATmega wieder schlafen legen
}

//Interrupt-Funktion
ISR(PCINT1_vect)
{
  // You have to write your own interrupt handler. Don't change the name!
  // This code will be called anytime when PCINT23 switches high to low,
  // or low to high. This is for INT3 and INT4 (both Port C)
  byte PVal;                                   // Port value (8 Bits)
  byte IRQ0ActVal;                             // Actual IRQ0 value
  byte IRQ1ActVal;                             // Actual IRQ3 value

  PVal = PINC;                                 // Read port C (8 bit)
  IRQ0ActVal = PVal & (1<<PCINT8);             // Mask out all except IRQ3
  IRQ0ActVal = IRQ0ActVal >> PCINT8;           // shift to right for bit0 position
  IRQ1ActVal = PVal & (1<<PCINT9);            // Mask out all except IRQ4
  IRQ1ActVal = IRQ1ActVal >> PCINT9;          // shift to right for bit0 position
 
  // für A0-Interrupt
  if(IRQ0PrevVal==0 && IRQ0ActVal==1)        // Transition 0-->1
  {
    // Place your command for rising signal here...
    IRQ0PrevVal=IRQ0ActVal;
  }
  else if(IRQ0PrevVal==1 && IRQ0ActVal==0)        // Transition 1-->0
  {
    // Place your command for falling signal here...
    IRQ0PrevVal=IRQ0ActVal;
    counter0++;
    delay(bounceTime);     
    irqFlag=1;   
  }

  // für A1-Interrupt
  else if(IRQ1PrevVal==0 && IRQ1ActVal==1)        // Transition 0-->1
  {
    // Place your command for rising signal here...
    IRQ1PrevVal=IRQ1ActVal;
  }
  else if(IRQ1PrevVal==1 && IRQ1ActVal==0)        // Transition 1-->0
  {
    // Place your command for falling signal here...
    IRQ1PrevVal=IRQ1ActVal;
    counter1++;
    delay(bounceTime); 
    irqFlag=1;
  } 
}
6  International / Deutsch / Re: 5V Arduino - 12V PC Lüfter on: May 28, 2014, 06:33:31 am
Schau mal in diesen Thread, da hatten wir es auch schon von dem Thema bzgl. der Ansteuerung über PWM:
http://forum.arduino.cc/index.php?topic=233003.msg1683289

Wenn ich mich noch richtig daran erinnere, zieht der Lüfter das Tachosignal auf Ground, d.h. man könnte das Signal auch mit 5V betreiben und damit direkt über den Arduino ansteuern.
7  International / Deutsch / Re: PCB Hersteller on: May 28, 2014, 06:03:24 am
Hatte bisher mehrmals bei Seeedstudio bestellt und kann nichts negatives berichten. Die Platinen werden relativ schnell gefertigt, der Versand kann dann jedoch mehrere Wochen dauern...
8  International / Deutsch / Re: RFM12b und Arduno Mega 2560 wie? :( on: May 28, 2014, 06:00:42 am
Wieso denn ohne Widerstände, vertragen die Leitungen denn 5V? Das Modul läuft üblicherweise auf 3,3 V, d.h. die beiden Widerstände bilden einen Spannungsteiler...

Wie bereits erwähnt, wenn du beide Widerstände mit 15k Ohm ersetzt, erhälst du 2,5 V. Meine Module arbeiten auch noch mit 2,4 V, laut Datenblatt glaube sogar noch weniger.

Teste doch einfach mal den RFM12-Demo Code, ob sich das Modul meldet. Hatte aber auch Probleme in Verbindung mit dem Mega. Hast du die Pinbelegung in der Library überprüft, die ist dort mit angegeben.

Gruß
9  International / Deutsch / Re: Mega 2560 - Energie sparen - Schlafmodus - Wie? on: May 21, 2014, 11:06:41 am
Hmm ja komisch, funktioniert teilweise nicht je nachdem was auf ON oder OFF gestellt wird. Folgendes Beispiel geht aber:
Code:
#include "LowPower.h"
int counter;

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

void loop()
{
  Serial.println(counter);
  Serial.flush();  // serielle Ausgabe beenden, bevor der µC wieder schlafen gelegt wird
  counter++;

  // ATmega2560
  LowPower.idle(SLEEP_8S, ADC_OFF, TIMER5_OFF, TIMER4_OFF, TIMER3_OFF,
  TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART3_OFF,
  USART2_OFF, USART1_OFF, USART0_OFF, TWI_OFF);
}

Oder direkt der "PowerDown"-Modus mit folgendem Befehl:
Code:
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

Folgende "Schlafzeiten" sind möglich: 15 ms, 30 ms, 60 ms, 120 ms, 250 ms, 500 ms, 1 s, 2 s, 4 s und 8 s. Wenn du mehr wie 8 Sekunden möchtest, musst du eben nochmal eine Schleife mit einem Zähler einbauen...
10  International / Deutsch / Re: Mega 2560 - Energie sparen - Schlafmodus - Wie? on: May 21, 2014, 05:36:06 am
Also ich verwende meistens die "Low Power Library" von Rocket Scream, die müsste auch mit dem Mega 2560 funktionieren.
Link hierzu: http://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-arduino-library/

Ob man den Spannungsregler umgehen kann und direkt 3,3V einspeisen, weiß ich auch nicht. Sauberer wäre es aber vermutlich, direkt einen anderen Spannungsregler einzubauen. Der dürfte vermutlich auch den Hauptverbrauch ausmachen, d.h. anstatt einem Linearregler einen Schaltregler verwenden...
11  International / Deutsch / Re: Arduino mit USB Stecker ála USB Stick on: April 28, 2014, 05:56:51 am
Ja aber selbst ohne RF-Modul ist es mit 27,50 € noch ziemlich teuer smiley-fat
12  International / Deutsch / Re: Arduino mit USB Stecker ála USB Stick on: April 28, 2014, 05:46:37 am
Vielleicht könntest ja ein "Jeelink" verwenden, siehe hier:
http://www.digitalsmarties.net/products/jeelink
http://jeelabs.net/projects/hardware/wiki/JeeLink

Ist von Jeelabs und hat auch das bekannte RFM12B-Modul mit dabei. Aber du könntest das RF-Modul ja auch weglassen und stattdessen die Pins für was anderes verwenden.

Wollte mir sowas auch schon nachbauen, finde nur keine USB-Gehäuse smiley-grin
13  International / Deutsch / Re: Programmcode verstehen >> Serial.println(status ? "EIN" : "AUS"); << on: April 24, 2014, 03:17:02 pm
Super, danke für die schnelle Antwort.
Google bringt eben nur was, wenn man weiß, wonach man suchen muß  smiley-lol
14  International / Deutsch / Programmcode verstehen >> Serial.println(status ? "EIN" : "AUS"); << on: April 24, 2014, 02:59:12 pm
Hallo Leute,

habe in einem Sketch eine Zeile entdeckt, die ich eigentlich ganz nützlich finde:
Code:
Serial.println(status ? "EIN" : "AUS");

'status' ist in diesem Fall eine Variable vom Typ boolean und falls 'true', wird EIN bzw. falls nicht, wird AUS ausgegeben. Kann Schreibarbeit im Vergleich zu einer if-Abfrage ersparen und sieht übersichtlicher aus.
Wird diese Abfrage mit dem Fragezeichen und Doppelpunkt irgendwo dokumentiert? Ich vermute mal, ist nichts Arduino spezielles aber weiß nicht, wie ich danach suchen soll...

Mich würde interessieren, ob es noch weitere Möglichkeiten gibt oder ob ich das auch irgendwie ohne die println-Ausgabe nutzen kann?
15  International / Deutsch / Re: Elektromotor Verwirrung on: April 19, 2014, 09:49:45 am
Ja über ein PWM-Signal, kannst ihn aber ohne Zusatzschaltung nicht direkt am Arduino anschließen...
Pages: [1] 2 3 ... 9