2 RGB-led på et breadboard kontroleret af arduino uno

LØST LØST LØST
Dav i gruppen

Jeg er helt ny i dette univers.
Jeg har lavet et board der har 2 RGB-led på, men det virker ikke. Når jeg kører en CTRL-R fortælle det mig at det er ok. Jeg kan også uplode det, men igen ingen ting sker.

Her er min kode.
Vedhæftet er mit board.

Kan nogen hjælpe en lille begynder. :slight_smile:

Hi
Ivan

int bluePin3 = 2;  // B petal on RGB LED module connected to digital pin 2 
/**************************************************************************/      
void setup()
{ 
         pinMode(redPin, OUTPUT); // sets the redPin to be an output 
         pinMode(greenPin, OUTPUT); // sets the greenPin to be an output 
         pinMode(bluePin, OUTPUT); // sets the bluePin to be an output 
         pinMode(redPin, OUTPUT); // sets the redPin to be an output 
         pinMode(greenPin, OUTPUT); // sets the greenPin to be an output 
         pinMode(bluePin, OUTPUT); // sets the bluePin to be an output
}    
/***************************************************************************/      
void loop()  // run over and over again  
{    
          // Basic colors:  
          color(255, 0, 0); // turn the RGB LED red 
          delay(1000); // delay for 1 second  
          color(0,255, 255); // turn the RGB LED green  
          delay(1000); // delay for 1 second  
          color(0, 0, 255); // turn the RGB LED blue  
          delay(1000); // delay for 1 second 
          // Example blended colors:  
          color(255,0,0); // turn the RGB LED red  
          delay(1000); // delay for 1 second  
          color(237,109,0); // turn the RGB LED orange  
          delay(1000); // delay for 1 second  
          color(255,215,0); // turn the RGB LED yellow  
          delay(1000); // delay for 1 second  
          color(34,139,34); // turn the RGB LED green  
          delay(1000); // delay for 1 second 
          color(0,0,255); // turn the RGB LED blue  
          delay(1000); // delay for 1 second
          color(0,46,90); // turn the RGB LED  indigo 
          delay(1000); // delay for 1 second
          color(128,0,128); // turn the RGB LED purple  
          delay(1000); // delay for 1 second
}     
/******************************************************/     
void color (unsigned char red, unsigned char green, unsigned char blue)     // the color generating function  
{    
          analogWrite(redPin, red);   
          analogWrite(bluePin, blue); 
          analogWrite(greenPin, green); 
}
/******************************************************/

RGB_LED_01.ino (2.62 KB)

Hej Ivan

For det første skal du lige huske, at Uno har PWM (analog output) på pin 3, 5, 6, 9, 10 og 11. Det OK med din første LED (pin 11, 10 og 9), men du skal huske det, til når du går i gang med den anden LED.

Hvad er det for en slags RGB-LED, du har? Er det fælles anode eller fælles katode? Og hvordan har du forbundet den til din arduino? Kan du eventuelt prøve at tegne et diagram/skitse?

Mvh.
Rune

Hej Rune

Har du kikket på min vedhæftede fil, der er et billede at hvordan jeg har sat det op.

RGB led er noget der hedder "common anode"

Ang. evt. skitse så der mit board på ved vedhæftede fil på mit første indlæg. :wink:

Hi
Ivan

Den vedhæftede fil er dit Arduino-program (RGB_LED_01.ino), og ikke et elektrisk diagram. Men prøv at se på den her side:

Dér er der vist en helt grundlæggende forbindelse af en common anode RGB LED. Det er godt nok nogle andre pins, end du bruger, men princippet er det samme.

En vigtig ting at huske med common anode LED er, at den virker "omvendt" af en almindelig LED eller en common cathode RGB LED. Det vil sige, at den tænder dioden når output er LOW, og slukker når output er HIGH. Den kode, du har angivet, er tydeligvis skrevet med common cathode i tankerne.

Så i dit tilfælde vil color(255, 255, 255); slukke LED'en, mens f.eks. color(0, 255, 255); vil få den til at lyse rød. Hvis du i stedet foretrækker at styre farven med 0 for slukket og 255 for tændt, så kan du bare ændre color() til:

void color (unsigned char red, unsigned char green, unsigned char blue)     // the color generating function  
{    
  analogWrite(255 - redPin, red);   
  analogWrite(255 - bluePin, blue); 
  analogWrite(255 - greenPin, green); 
}

Hej Rune

Nu har jeg sat de tre andre ledninger til 6,5 og 3 alle er, som du siger, er det PWM. Det virker som jeg vill have det til.
El. diagram, er det, det der hedder "Schematic"
Som sagt det virker, jeg ved bare ikke hvorfor. De tre første sidder også i PWM. Da begge set pin er sat på PWM hvordan kan det være at andet set pin(6,5,3) skal have "analogWrite"

Jeg kan ikke lige se hvorfor??

Hvad nu hvis jeg vil have flere RGB'er på, hvordan klarer jeg det.

Hi
Ivan

navi_snuller:
El. diagram, er det, det der hedder "Schematic"

Ja, lige præcis. Altså en tegning over komponenterne og hvordan de er forbundet.

navi_snuller:
Som sagt det virker, jeg ved bare ikke hvorfor.

"If it ain't broke, don't fix it!" :slight_smile:

navi_snuller:
De tre første sidder også i PWM. Da begge set pin er sat på PWM hvordan kan det være at andet set pin(6,5,3) skal have "analogWrite"

Jeg kan ikke lige se hvorfor??

Jeg er ikke sikker på, at jeg forstår hvad du spørger om. Du kan i princippet styre LED'en både med digitalWrite og analogWrite, men hvis du vil have finkontrol over farverne, så skal du bruge analogWrite på PWM-porte.

navi_snuller:
Hvad nu hvis jeg vil have flere RGB'er på, hvordan klarer jeg det.

Ja, så er du nødt til at bygge eller købe en port-udvidelse til din arduino. Der er mange forskellige løsninger.

En let løsning er at bruge Adafruit's 16-kanals servo-drivere (kopiprodukter kan købes i Kina på ebay for ca. 25 kr/stk). Det er små moduler med 16 PWM-porte. De forbindes til din Arduino med to ledninger til det der hedder I2C (eller TWI). Du kan kæde helt op til 62 moduler sammen, så du kan styre mere end 300 RGB-LED'er, hvis du skulle få lyst til det.

Hvis du er mere eventyrlysten er der chips som f.eks. TLC5940 (seriel styring) fra Texas Instruments eller MAX7313 (I2C) fra Maxim Integrated. Det kræver bare lidt mere arbejde.

Jeg har selv brugt MCP23017 port expanders til RGB-LED'er i et lille projekt, men de understøtter ikke PWM - kun digital output (dvs. HIGH eller LOW). Det giver dog mulighed for at vælge mellem slukket, rød, grøn, blå, tyrkis, gul og hvid.

Afhængigt af hvor mange flere RGB-LED'er du vil have, så kan du også overveje at "opgradere" til en Arduino Mega, som har 14 PWM-porte. En kopi-Mega kan man købe på ebay for ca. 50 kr.

Dav igen

Jeg har forsøgt at tegne et diagram over mit lille projekt, det lykkes ikke rigtigt. Findes der et program til at lave den slags tegninger i??

Hi
Ivan

Jeg bruger ofte et program, der hedder Fritzing (Welcome to Fritzing). Det kan både lave diagrammer, breadboard/fumlebræt-tegninger og simple print/PCB-layouts, men uden at det bliver så avanceret som de mere professionelle CAD-programmer. Fritzing er ret oplagt til arduino-projekter, hvilket også afspejles af de indbyggede komponentbiblioteker. Programmet kræver lige lidt tilvænning, men når man har lært det at kende, er det faktisk ret godt.

Hvis det bare er til små kredsløb, så er håndtegninger dog ofte det hurtigste.

A propos portudvidelser, så vedhæfter jeg lige som eksempel et diagram (schematic), jeg har lavet i fritzing af en 4 x 16-ports udvidelse til en arduino.

Hej

Det er også det program jeg bruger, men når jeg vil lave en Schematic tegning så bliver det Breadboard der kommer på billed og det ser ikke så godt ud.
Hvordan for du Scheamatic ud som billed.

jeg gør det at jeg "File/Export/As Image/JPG" så er det at der kun kommer et billede af Breadboard? :smiling_imp:

Når du arbejder med et projekt i fritzing, så kan du oppe i toppen vælge mellem Breadboard, Schematic og PCB. Det er i princippet 3 forskellige måder at lave det samme, afhængigt af, hvad man vil have. Personligt bruger jeg kun Schematic. Hvis jeg vil gemme et diagram som et billede, vælger jeg File > Export > As Image > PNG.

Dav igen igen

Jeg har arbejdet lidt med Schematic.

Håber at det er, bare lidt, rigtigt.

Hi Ivan

Det er i hvert fald et hæderligt første forsøg :wink:

Når du sætter en RGB-LED ind i fritzing, vil den som udgangspunkt være "common cathode". Dette skal du rette ved at markere LED'en og så rette "polarity" til "common anode" ovre i Inspector-vinduet til højre.

Jeg har vedhæftet et ændringsforslag.

Dav

Det er da altid noget at du syntes at det er et hæderligt forsøg. :smiley:

nu der er kommet noget der hedder "color is not declared"

Hvad er nu det for noget, der står jo "color" i en oprindelige code ??

exit status 1
'color' was not declared in this scope

This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.

Det kan være en manglende tuborg-parantes eller semikolon eller lignende. Prøv at gå dit arduino-program efter en gang til. Hvis du ikke kan finde fejlen, kan du vedhæfte den her.

Dav Rune

Det var, efter mange forskellige prøvelser et "/" der var for enden af en række "*"

Tænk at en så lille ting kan give mig så mange grå hår i hovedet.

Du er en skrapsak til det her programering. :wink:

Takker mange gange fr hjælpen.

Kommer jo nok igen på et tidspunkt ;D

Hi
Ivan

Hej Rune

Der er gået lidt tid.
Den fejl " color was not declared in this scope"

Jeg kan ikke finde fejlen, vil du prøve om du kan se hvad jeg har lavet galt. >:(

Hi
Ivan

RGB_LED.ino (2.01 KB)

Hej Ivan

Du har ikke fået skrevet din color-funktion korrekt. Jeg har prøvet at skrive den her i to "overloadede" versioner. Det vil sige, at du kan kalde den med enten 3 eller 6 parametre, afhængigt af om du vil sætte farve på 1 eller 2 LED'er.

Funktionerne tager nu også højde for, at du med common anode LED'er skal bruge analogWrite(pin, 255) for at slukke en farvekanal, og analogWrite(pin, 0) for at sætte fuld blus på.

Prøv følgende:

const int redPin = 6;   // R petal on RGB LED module connected to digital pin 6
const int greenPin = 5; // G petal on RGB LED module connected to digital pin 5
const int bluePin = 3;  // B petal on RGB LED module connected to digital pin 3
const int redPin1 = 11;
const int greenPin1 = 10;
const int bluePin1 = 9;

// Set color (1 LED)
void color(uint8_t red, 
           uint8_t green, 
           uint8_t blue) {
  analogWrite(redPin, 255-red);
  analogWrite(bluePin, 255-blue);
  analogWrite(greenPin, 255-green);
}

// Set color (2 LEDs)
void color(uint8_t red, 
           uint8_t green, 
           uint8_t blue, 
           uint8_t red1, 
           uint8_t green1, 
           uint8_t blue1) {
  analogWrite(redPin, 255-red);
  analogWrite(bluePin, 255-blue);
  analogWrite(greenPin, 255-green);
  analogWrite(redPin1, 255-red1);
  analogWrite(bluePin1, 255-blue1);
  analogWrite(greenPin1, 255-green1);
}


void setup()
{
  pinMode(redPin, OUTPUT);   // sets the redPin to be an output
  pinMode(greenPin, OUTPUT); // sets the greenPin to be an output
  pinMode(bluePin, OUTPUT);  // sets the bluePin to be an output
  pinMode(redPin1, OUTPUT);
  pinMode(greenPin1, OUTPUT);
  pinMode(bluePin1, OUTPUT);
}

void loop()               // run over and over again
{
  // Basic colors:
  color(0, 0, 255);      // turn the RGB LED red
  delay(500);           // delay for 1 second
  color(0, 255, 255);   // turn the RGB LED green
  delay(500);           // delay for 1 second
  color(0, 0, 255);     // turn the RGB LED blue
  delay(500);           // delay for 1 second

  // Example blendezd colors:
  color(255, 0, 0);       // turn the RGB LED red
  delay(500);             // delay for 1 second
  color(237, 109, 0);     // turn the RGB LED orange
  delay(500);             // delay for 1 second
  color(255, 215, 0);     // turn the RGB LED yellow
  delay(500);             // delay for 1 second
  color(34, 139, 34);    // turn the RGB LED green
  delay(500);            // delay for 1 second
  color(0, 0, 255);      // turn the RGB LED blue
  delay(500);            // delay for 1 second
  color(0, 46, 90);      // turn the RGB LED  indigo
  delay(500);            // delay for 1 second
  color(128, 0, 128);    // turn the RGB LED purple
  delay(500);            // delay for 1 second

}