INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Serial Monitor Eingabe über Code
09.05.2016, 12:21
Beitrag #1
Serial Monitor Eingabe über Code
Hi, ich würde gerne folgenden Code so ändern, dass ich nicht mehr über den Serial Monitor den Code eingeben muss welcher gesendet werden soll, sondern ich würde gerne in Zukunft taster an den Arduino anschliessen und über diese die Funktion des sendens mit dem jeweils passenden code aufrufen. Leider finde ich mich nicht so ganz zurecht in dem code... vielleicht hat einer von euch ja den überblick und kann mir helfen.

Link zum Github Projekt: https://github.com/probonopd/arduino-infrared-pronto


Code:
/*
Send Pronto Hex via an IR LED connected to Arduino Pin D9.
Make sure you do not send a blank (" ") as the last character.
Send the following command over the serial line:

Sony12, device = 1, obc = 47
SEND 0000 0067 0000 000d 0060 0018 0030 0018 0030 0018 0030 0018 0030 0018 0018 0018 0030 0018 0018 0018 0030 0018 0018 0018 0018 0018 0018 0018 0018 03de

or

# RC5, device = 11, obc = 64
SEND 0000 0073 0000 000B 0040 0020 0020 0020 0020 0040 0040 0040 0020 0020 0040 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0CC8

Based on IR_Player_ProntoCode.c by Stephen Ong
https://github.com/stephenong/Arduino-IR-Remote-Control-Player

This work is licenced under the Creative Commons Attribution-NonCommercial
3.0 Unported License. To view a copy of this licence, visit
http://creativecommons.org/licenses/by-nc/3.0/ or send a letter to Creative
Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.

http://creativecommons.org/licenses/by-nc/3.0/
*/

#include <avr/interrupt.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#include <stdint.h>
#include <avr/io.h>
#define IR_PORT PORTB
// #define IR_PIN PINB
// #define IR_DDR DDRB
// #define IR_BV _BV(1)
#define IR_OCR OCR1A
#define IR_TCCRnA TCCR1A
#define IR_TCCRnB TCCR1B
#define IR_TCNTn TCNT1
#define IR_TIFRn TIFR1
#define IR_TIMSKn TIMSK1
#define IR_TOIEn TOIE1
#define IR_ICRn ICR1
#define IR_OCRn OCR1A
#define IR_COMn0 COM1A0
#define IR_COMn1 COM1A1
#define PRONTO_IR_SOURCE 0 // Pronto code byte 0
#define PRONTO_FREQ_CODE 1 // Pronto code byte 1
#define PRONTO_SEQUENCE1_LENGTH 2 // Pronto code byte 2
#define PRONTO_SEQUENCE2_LENGTH 3 // Pronto code byte 3
#define PRONTO_CODE_START 4 // Pronto code byte 4

static const uint16_t *ir_code = NULL;
static uint16_t ir_cycle_count = 0;
static uint32_t ir_total_cycle_count = 0;
static uint8_t ir_seq_index = 0;
static uint8_t ir_led_state = 0;

void ir_on()
{
  IR_TCCRnA |= (1<<IR_COMn1) + (1<<IR_COMn0);
  ir_led_state = 1;
}

void ir_off()
{
  IR_TCCRnA &= ((~(1<<IR_COMn1)) & (~(1<<IR_COMn0)) );
  ir_led_state = 0;
}

void ir_toggle()
{
  if (ir_led_state)
    ir_off();
  else
    ir_on();
}

void ir_start(uint16_t *code)
{
  ir_code = code;
//  IR_PORT &= ~IR_BV; // Turn output off (atmega328 only)
  digitalWrite(9,LOW); // Turn output off
//  IR_DDR |= IR_BV; // Set it as output (atmega328 only)
  pinMode(9,OUTPUT); // Set it as output
  IR_TCCRnA = 0x00; // Reset the pwm
  IR_TCCRnB = 0x00;
  //printf_P(PSTR("FREQ CODE: %hd\r\n"), code[PRONTO_FREQ_CODE]);
  uint16_t top = ( (F_CPU/1000000.0) * code[PRONTO_FREQ_CODE] * 0.241246 ) - 1;
  //printf_P(PSTR("top: %hu\n\r"), top);
  IR_ICRn = top;
  IR_OCRn = top >> 1;
  IR_TCCRnA = (1<<WGM11);
  IR_TCCRnB = (1<<WGM13) | (1<<WGM12);
  IR_TCNTn = 0x0000;
  IR_TIFRn = 0x00;
  IR_TIMSKn = 1 << IR_TOIEn;
  ir_seq_index = PRONTO_CODE_START;
  ir_cycle_count = 0;
  ir_on();
  IR_TCCRnB |= (1<<CS10);
}

#define TOTAL_CYCLES 80000 // Turns off after this number of
// cycles. About 2 seconds
// FIXME: Turn off after having sent
ISR(TIMER1_OVF_vect) {
  uint16_t sequenceIndexEnd;
  uint16_t repeatSequenceIndexStart;
  ir_total_cycle_count++;
  ir_cycle_count++;

  if (ir_cycle_count== ir_code[ir_seq_index]) {
    ir_toggle();
    ir_cycle_count = 0;
    ir_seq_index++;
    sequenceIndexEnd = PRONTO_CODE_START +
      (ir_code[PRONTO_SEQUENCE1_LENGTH]<<1) +
      (ir_code[PRONTO_SEQUENCE2_LENGTH]<<1);

    repeatSequenceIndexStart = PRONTO_CODE_START +
      (ir_code[PRONTO_SEQUENCE1_LENGTH]<<1);

    if (ir_seq_index >= sequenceIndexEnd ) {
      ir_seq_index = repeatSequenceIndexStart;

      if(ir_total_cycle_count>TOTAL_CYCLES) {
        ir_off();
        TCCR1B &= ~(1<<CS10);
      }
    }
  }
}

void ir_stop()
{
  IR_TCCRnA = 0x00; // Reset the pwm
  IR_TCCRnB = 0x00;
}

const uint16_t inputLength = 512;

void setup() {
  Serial.begin(9600);
  Serial.println("READY");
}

void loop()
{
  if ( Serial.available() > 0 )
  {
    static char input[inputLength];
    static uint16_t i;
    char c = Serial.read();

    if ( c != '\r' && c != '\n' && i < inputLength-1){
      input[i++] = c;
    }
    
    else
    {
      input[i] = '\0';
      i = 0;

      uint16_t array[80];
      uint16_t j = 0;

      if ( !strncmp(input, "SEND", 4) )
      {
        char* p = input+4;

        while ( (p = strchr(p, ' ')) != NULL )
          array[j++] = strtol(p, &p, 16);

        ir_start(array);
        Serial.print("SENT ");
        for ( uint8_t i = 0; i < j; i++ )
        {
          Serial.print ("0x");
          Serial.print (array[i], HEX);
          Serial.print(" ");
        }


        Serial.println();
      }
    }
  }

}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.05.2016, 19:08
Beitrag #2
RE: Serial Monitor Eingabe über Code
Zitat:sondern ich würde gerne in Zukunft taster an den Arduino anschliessen und über diese die Funktion des sendens mit dem jeweils passenden code aufrufen.
Wie viele Taster sollten es sein ?

Wen es mehrere sein sollten musst du die mit eine Schieberegister lösen, zB. mit dem 74HC165.

Wen ich dich richtig verstehe, willst du eine Fernbedienung für ein Sony-Gerät machen ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.05.2016, 22:46
Beitrag #3
RE: Serial Monitor Eingabe über Code
Es sollten schon einige Taster sein, etwa 5 vielleicht.... Steht noch nicht ganz fest. Aber wieso brauche ich ein SR? Kann ich nicht einfach über DigitalRead die Taster abfragen und dann jeweils eine Methode ausführen welche den jeweiligen code sendet? Der HexCode funktioniert über die Serielle Eingabe schon (da ist nur das Problem dass er den Code erst nach 3 maliger eingebe sendet und dann nie wieder, erst wenn der Arduino resetet wird). also würde ich gerne entweder diese Eingabe über den Programm-Code vortäuschen oder diesen Umweg weglassen und direkt die passende Methode ansprechen.

Richtig! ich möchte damit eine Kamera fernbedienen. Ich habe eine Fernbedienung mit 2 Befehlen: "Auslösen", "Auslösen in 2s" . Ich würde gerne über den Arduino mehr Möglichkeiten erhalten.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.05.2016, 17:26
Beitrag #4
RE: Serial Monitor Eingabe über Code
Zitat: Kann ich nicht einfach über DigitalRead die Taster abfragen und dann jeweils eine Methode ausführen welche den jeweiligen code sendet?
Wieso sollte dies nicht gehen ?

Zitat:(da ist nur das Problem dass er den Code erst nach 3 maliger eingebe sendet und dann nie wieder, erst wenn der Arduino resetet wird)
Das verstehe ich nicht, was du damit meinst ?
List du 3 Zeichen an der Schnittstelle ein, und erst dann sendete der Arduino wieder an die Schnittstelle ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.05.2016, 18:57
Beitrag #5
RE: Serial Monitor Eingabe über Code
Hallo,
also den Code, den Du da nutzt versteht wohl nur der, der ihn geschrieben
hat.

Ich halte das Ganze auch für zu umständlich, klobb es in die Tonne!

Dann besuchst Du diese Seite und liest Dir das einmal durch.
Das Zeug´s funktioniert einwandfrei.

Für den Arduino brauchst Du noch einen Empfänger (TSOP4830 oder besser
TSOP31230) die passende Frequenz mußt Du Dir raussuchen.
Im Datenblatt gibt es auch einen einfachen Verdrahtungsplan der mit dem
Arduino Funktioniert.
Dann brauchst Du noch eine IR-Sender-Diode die zu Deinem Empfänger paßt.
Wenn Du das alles verdrahtet hast, dann probierst Du die Beispiele der
Lib.
Du wirst sehen, es ist ganz einfach.
Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Servo über Temperatur steuern querkopf71 3 70 07.12.2016 19:21
Letzter Beitrag: hotsystems
  Ausgabe Serial Monitor zu viele Byt`s Hannes 0 98 12.11.2016 20:29
Letzter Beitrag: Hannes
  Kommunikation über das WiFi-Shield Flap 3 234 07.11.2016 20:20
Letzter Beitrag: hotsystems
  Menü über Bluetooth Eingabe abwarten anwo 4 504 18.10.2016 08:59
Letzter Beitrag: Lolliball
  Einfacher Tacho für niedrige Geschwindigkeiten – Code optimieren Bastelo 2 261 12.10.2016 20:31
Letzter Beitrag: Bastelo
  Daten über USB verarbeiten Felix91 10 326 12.10.2016 13:00
Letzter Beitrag: Tommy56
  Code mit Verifikation über Keypad & LCD machnetz 5 215 10.10.2016 15:01
Letzter Beitrag: torsten_156
  Speicher sparen bei serial.print?? DL1AKP 3 194 02.09.2016 13:32
Letzter Beitrag: hotsystems
  Arduino Steuern über eigne Homepage b3ta 8 401 16.08.2016 11:07
Letzter Beitrag: Pit
  Serial Monitor ASCII 1 schreiben BennIY 11 580 01.08.2016 16:42
Letzter Beitrag: Mathias

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste