Styra en Arduino med en annan?
Styra en Arduino med en annan?
Håller på med IR fjärr och "neopixel slingor", och det dummar sig. Efter att ha läst lite så verkar det som just denna kombo stör varandra. Så jag tänkte ok, då tar jag väl bara en Arduino och kopplar IR piren på den och så får den styra de andra Arduinon'na som har "neopixlarna" på sig.
Behöver jag sätta motstånd och grejer mellan eller är det bara koppla ihop?
Behöver jag sätta motstånd och grejer mellan eller är det bara koppla ihop?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
- Hobbyisten
- Gått bort
- Inlägg: 2531
- Blev medlem: 3 december 2017, 22:55:25
Re: Styra en Arduino med en annan?
Jag tror inte du kan styra med en analog INGÅNG från IR-Arduinon. Vill du bara switcha korten med LED-slingorna kanske det går bra med GPIO-stiften på respektive arduino ?
Re: Styra en Arduino med en annan?
Att det skulle vara exakt en av de analoga portarna var mer en slump på bilden. Men i teorin så borde jag kunna skicka ut 1V på A1 och om det är 1V på A1 på nästa kort som läser av det så borde det kunna representera blå färg. A2 -> 2V röd, etc ?
Har massor med digitala portar över. Så lättare kanske är att sätta 0/1 på några av dom.
Men frågan kvarstår, behöver jag sätta motstånd i mellan eller är det bara köra kabel rakt över?
Har massor med digitala portar över. Så lättare kanske är att sätta 0/1 på några av dom.
Men frågan kvarstår, behöver jag sätta motstånd i mellan eller är det bara köra kabel rakt över?
Re: Styra en Arduino med en annan?
Det Arduino kallar analoga ingångar kan även användas till digital ut- eller insignal, även i Arduino-miljö.
Annars går det väl att direkt koppla en utgång till en eller flera ingångar. Ett par 100 ohm serieresistans mellan enheterna skadar inte om man "råkar" koppla utgång mot utgång. Du skall däremot inte koppla ihop +5V pinnarna om enheterna har varsin matning, det räcker med GND. Vad är det för IR-grunka du har? Tar emot från en fjärrkontroll, eller?
Annars går det väl att direkt koppla en utgång till en eller flera ingångar. Ett par 100 ohm serieresistans mellan enheterna skadar inte om man "råkar" koppla utgång mot utgång. Du skall däremot inte koppla ihop +5V pinnarna om enheterna har varsin matning, det räcker med GND. Vad är det för IR-grunka du har? Tar emot från en fjärrkontroll, eller?
Re: Styra en Arduino med en annan?
Kan ju sätta upp en som I2C master och resten som slave; https://www.arduino.cc/en/Tutorial/MasterWriter . Då kan de addresseras separat.
- Krille Krokodil
- Inlägg: 4062
- Blev medlem: 9 december 2005, 22:33:11
- Ort: Helsingborg
Re: Styra en Arduino med en annan?
Det ser ut som det skulle finnas tid att hantera båda om man stukar om lite i koderna. IR-ingången ska läsas av var 50 us och en Neopixelsändning tar 24*1.25 us.
Re: Styra en Arduino med en annan?
Men det hjälper ju inte om IR-avläsningen tar mer än 50 us, då får ju neo-pixel-kedjorna en reset och plockar det värde de råkar ha för stunden, som egentligen skulle ha skiftats vidare. "Stuka om lite i koderna" är nog inte aktuellt för gemene Arduino-användare, de använder färdiga "bibliotek" av varierande kvalitet. Gå in och rota i dem är nog inte aktuellt (om inte någon annan gör det). Men visst, det går nog att få en ATMega att göra alla tre jobb, men troligen inte med Arduino-bibliotek.
Re: Styra en Arduino med en annan?
Använde serieporten och skicka över koderna där istället.
TXD på IR-mastern --> RXD på båda LED-drivarna.
Överföringen sker asynkront i bakgrunden, och lär knappast störa LED-drivningen.
/J
TXD på IR-mastern --> RXD på båda LED-drivarna.
Överföringen sker asynkront i bakgrunden, och lär knappast störa LED-drivningen.
/J
Re: Styra en Arduino med en annan?
Problemet är att jag har gjort två skyltar varav detta är den ena:
Därför behöver jag ha en enhet som tar emot signalen och skickar den vidare till de två arduinos som blippar med skyltarna.
Fjärren är en sån här enkel grej: Kjell&Company: 87895
Det skulle bara blinka - - X - - - X - - - X som ett rinnande ljus. Fine, inga problem. För att inte stressa varken power supply eller behöva dra massa kablar mellan dessa så gjorde jag två helt separata lösningar en för varje skylt. Men nu ska dom så klart ändra och vill göra detta med fjärrkontroll. Eftersom fjärren funkar bra ibland, ibland inte om det är snabba grejer som händer, så kan jag inte förlita mig på detta eftersom båda skyltarna ska vara synkade.Därför behöver jag ha en enhet som tar emot signalen och skickar den vidare till de två arduinos som blippar med skyltarna.
Fjärren är en sån här enkel grej: Kjell&Company: 87895
Kod: Markera allt
#include <FastLED.h>
#include <IRremote.h>
// Define the array of leds
#define LED_DT 6 // Ledstrip data pin
#define COLOR_ORDER GRB
#define LED_TYPE WS2812
#define NUM_LEDS 30
uint8_t max_bright = 255;
struct CRGB leds[NUM_LEDS];
int IR_PIN = 12; // IR sensor data pin
int button = 1;
int k;
int RED = 255;
int GREEN = 255;
int BLUE = 50;
IRrecv irDetect(IR_PIN); //IR sensor
decode_results irIn; //IR sensor
void setLEDs (int K, int N) {
FastLED.clear();
for (int i = 0; i < NUM_LEDS; i++) {
if (i % N == K) leds[i].setRGB (RED, GREEN, BLUE); // set red LED
}
FastLED.show();
}
void decodeIR() // Indicate what key is pressed
{
switch(irIn.value)
{
case 0xFF6897: // Knapp 1 - Theater chase
button=1;
break;
case 0xFF9867:
button=2;
break;
case 0xFFB04F:
button=3;
break;
case 0xFF30CF:
button=4;
break;
case 0xFF629D:
if(button <= 3){
button = button + 1;
}
break;
case 0xFFA857:
if(button >= 2){
button = button - 1;
}
break;
}
}
void setup() {
Serial.begin(9600);
irDetect.enableIRIn(); // Start the Receiver
delay (1000);
LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(max_bright);
}
void loop() {
if (irDetect.decode(&irIn)) {
decodeIR();
irDetect.resume();
}
if (button==1){
for (int i = 0; i < 3; i++) {
FastLED.setBrightness(max_bright);
setLEDs (i, 3);
delay (200);
}
if (irDetect.decode(&irIn)) {
decodeIR();
irDetect.resume();
}
Serial.println("1");
}
if (button==2){
//for (int i = 0; i < 4; i++) {
// setLEDs (i, 4);
// delay (200);
//}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i].setRGB (RED, GREEN, BLUE); // set red LED
}
if (irDetect.decode(&irIn)) {
decodeIR();
irDetect.resume();
}
FastLED.setBrightness(max_bright);
FastLED.show();
delay (100);
Serial.println("2");
}
if (button==3){
for(int j = 0; j < 12; j++)
{
if(j==0){
k = 0;
}
if(j==1){
k = 0;
}
if(j==2){
k = 0;
}
if(j==3){
k = 0;
}
if(j==4){
k = 0;
}
if(j==5){
k = 50;
}
if(j==6){
k = 150;
}
if(j==7){
k = 255;
}
if(j==8){
k = 150;
}
if(j==9){
k = 50;
}
if(j==10){
k = 0;
}
if(j==11){
delay(3000);
}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i].setRGB (RED, GREEN, BLUE); // set red LED
}
if (irDetect.decode(&irIn)) {
decodeIR();
irDetect.resume();
}
FastLED.setBrightness(k);
FastLED.show();
delay(75);
Serial.println("3");
}
}
if (button==4){
for (int i = 0; i < 3; i++) {
FastLED.setBrightness(255);
setLEDs (i, 3);
if (irDetect.decode(&irIn)) {
decodeIR();
irDetect.resume();
}
delay (45);
}
Serial.println("4");
}
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Styra en Arduino med en annan?
Ok. Så du behöver bara säga "nu". Då är det totalt overkill med I2C eller UART. Det räcker att sätta en pinne hög eller låg för att berätta när "nu" är. Men skippa att koppla ihop +5V, annars kommer de tre spänningsregulatorerna bara att bråka med varandra. Men gemensam GND behövs.
- Krille Krokodil
- Inlägg: 4062
- Blev medlem: 9 december 2005, 22:33:11
- Ort: Helsingborg
Re: Styra en Arduino med en annan?
Neopixeln har en 50 us paus mellan varje sändning så där finns tid för att behandla IR-datan i hudloopen, bara läsningen av
IR-pinnen skulle då ske med ske med 50 us interrupt och utanför Neopixel-burstarna på 30 us.
https://github.com/z3t0/Arduino-IRremot ... remote.cpp
IR-pinnen skulle då ske med ske med 50 us interrupt och utanför Neopixel-burstarna på 30 us.
Kod: Markera allt
#ifdef IR_TIMER_USE_ESP32
void IRTimer()
#else
ISR (TIMER_INTR_NAME)
#endif
{
// Read if IR Receiver -> SPACE [xmt LED off] or a MARK [xmt LED on]
// digitalRead() is very slow. Optimisation is possible, but makes the code unportable
uint8_t irdata = (uint8_t)digitalRead(irparams.recvpin);
[...]
Re: Styra en Arduino med en annan?
Neo-pixel skall ha en 50us paus efter att HELA sekvensen har sänts, då uppdateras varje pixel, får den det innan så blir det bajs. IR-mottagning handlar inte om att läsa en pinne utan att mäta tidsavstånd mellan ett antal pin-förändringar. Som Neo-pixel fast tvärt om, att läsa istället för att skriva.
- Krille Krokodil
- Inlägg: 4062
- Blev medlem: 9 december 2005, 22:33:11
- Ort: Helsingborg
Re: Styra en Arduino med en annan?
"Swinger" står där väl.
@snigelen: Du har rätt, jag hade missat att bursten är för alla LED:sen. Och då måste IR-läsningen ligga i Neopixel-interruptet, det är betydligt kladdigare att få till.
IR-pinnen behöver bara läsas var 50 us, man har ingen nytta av att tolka den informationen under tiden Neopixeln uppdateras. Så de avläsningarna kan man lagra i en bitbuffert och berarbeta i efterhand, det är en väldigt liten modifikation på den existerande IR-hanteraren. Timingen i den koden kommer enbart från att den förutsätter att pinner blir avläst med 50 us intervall, så även om den får processa en bitbuffert indirekt free-running så kommer mätningen av tidsavstånden bli korrekt.
@snigelen: Du har rätt, jag hade missat att bursten är för alla LED:sen. Och då måste IR-läsningen ligga i Neopixel-interruptet, det är betydligt kladdigare att få till.
IR-pinnen behöver bara läsas var 50 us, man har ingen nytta av att tolka den informationen under tiden Neopixeln uppdateras. Så de avläsningarna kan man lagra i en bitbuffert och berarbeta i efterhand, det är en väldigt liten modifikation på den existerande IR-hanteraren. Timingen i den koden kommer enbart från att den förutsätter att pinner blir avläst med 50 us intervall, så även om den får processa en bitbuffert indirekt free-running så kommer mätningen av tidsavstånden bli korrekt.
Re: Styra en Arduino med en annan?
Det är deras logga:
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.