Gå til innhold

Den lille Arduino-tråden


Anbefalte innlegg

Videoannonse
Annonse

Hei, jeg har et problem med klokken på min arduino. Jeg kontrollerer en viftekontroller med PWM. Pga standard PWM frekvens lagde støy satte jeg opp PWM frekvensen til 63.5kHz i setup funksjonen slik:

TCCR0B = TCCR0B & B11111000 | B00000001;

Men da jeg prøvde disse funksjonene, så jeg at klokken gikk alt for fort. Tar bare 10-20 sek før det har gått en time. Jeg regner med det er en sammenheng mellom PWM frekvensen og klokken, så jeg lurer på om det finnes en måte å få en korrekt klokke samtidig som PWM frekvensen er >20kHz.

Lenke til kommentar

Støyen kom av at viften skrudde seg av og på 976 ganger i sekunder som ga en lyd med frekvens på 976 Hz. Derfor må PWM frekvensen være over 20kHz.

Viftekontrolleren støtter kun PWM input, men jeg kan jo sette en kondensator i parallell på utgangen ja.

Bruker ikke en ekstern klokke.

Lenke til kommentar

Hei, jeg har et problem med klokken på min arduino. Jeg kontrollerer en viftekontroller med PWM. Pga standard PWM frekvens lagde støy satte jeg opp PWM frekvensen til 63.5kHz i setup funksjonen slik:

TCCR0B = TCCR0B & B11111000 | B00000001;

Men da jeg prøvde disse funksjonene, så jeg at klokken gikk alt for fort. Tar bare 10-20 sek før det har gått en time. Jeg regner med det er en sammenheng mellom PWM frekvensen og klokken, så jeg lurer på om det finnes en måte å få en korrekt klokke samtidig som PWM frekvensen er >20kHz.

 

Det er antakelig fordi du har tuklet med timeren som brukes i denne "time and date" funksjonen.

 

 

 

 

Løsningen er å bruke en annen timer til PWM.

Bruk pinne 9 eller 10 til PWM utganger og dermed still på denne timeren:

TCCR1B = TCCR1B & 0b11111000 | 0x01;

Denne går bare opp til maximalt 31372.55 Hz dog ved en "setting" på 0x01 men jeg vil tro at det er mer en nok (det ligger jo ihvertfall langt ovenfor det hørbare området)

 

Og husk å sette tilbake den timeren som du har tuklet med til default for å få riktig tidsregning igjen:

TCCR0B = TCCR0B & 0b11111000 | 0x03;

Dette trengs selvsagt bare å gjøres en gang også trenger du ikke å ha det i programmet ditt lenger.

Endret av flesvik
  • Liker 1
Lenke til kommentar
flesvik, den 24 Mai 2014 - 23:01, sa:

 

Kirchhoff, den 24 Mai 2014 - 18:12, sa:

Hei, jeg har et problem med klokken på min arduino. Jeg kontrollerer en viftekontroller med PWM. Pga standard PWM frekvens lagde støy satte jeg opp PWM frekvensen til 63.5kHz i setup funksjonen slik:

TCCR0B = TCCR0B & B11111000 | B00000001;

Men da jeg prøvde disse funksjonene, så jeg at klokken gikk alt for fort. Tar bare 10-20 sek før det har gått en time. Jeg regner med det er en sammenheng mellom PWM frekvensen og klokken, så jeg lurer på om det finnes en måte å få en korrekt klokke samtidig som PWM frekvensen er >20kHz.

 

Det er antakelig fordi du har tuklet med timeren som brukes i denne "time and date" funksjonen.

 

 

 

 

Løsningen er å bruke en annen timer til PWM.

Bruk pinne 9 eller 10 til PWM utganger og dermed still på denne timeren:

TCCR1B = TCCR1B & 0b11111000 | 0x01;

Denne går bare opp til maximalt 31372.55 Hz dog ved en "setting" på 0x01 men jeg vil tro at det er mer en nok (det ligger jo ihvertfall langt ovenfor det hørbare området)

 

Og husk å sette tilbake den timeren som du har tuklet med til default for å få riktig tidsregning igjen:

TCCR0B = TCCR0B & 0b11111000 | 0x03;

Dette trengs selvsagt bare å gjøres en gang også trenger du ikke å ha det i programmet ditt lenger.

 

Takk for grundig svar. Skal prøve å benytte timer 2. Hva mener du med at bare trengs å gjøres en gang? Jeg må vel ha det med i setup hver gang? (ikke i loopen)

Lenke til kommentar

Du trenger bare å sette TCCR0B tilbake til default en gang. Deretter trenger du ikke å ha det lenger i setup i programmet ditt for da er det jo allerede blitt satt tilbake til default og det har ingen funksjon i programmet ditt lenger. Da er det bare en kilde til forvirring senere når du ikke lenger husker hvorfor den er der.

Endret av flesvik
Lenke til kommentar

Trenger litt hjelp her. Fikk min Arduino i posten i dag, men får den ikke til å fungere som den skal. Det er en billigtype fra dx (http://www.dx.com/p/funduino-uno-r3-mega328p-board-for-hw-sw-engineers-development-tools-150802#.U4Ok-ijm75c ).

 

Når jeg prøver å laste opp et program, så får jeg feilkoden:

avrdude: stk500_getsync(): not in sync: resp=0x00

 

Har googlet litt og prøvd forskjellige løsninger, men får det ikke til. Så da lurer jeg på om det er noen her som kan være til hjelp?

 

Edit: Fant ut av det til slutt. Måtte bare endre serial port. :)

Endret av erlendo89
Lenke til kommentar

Trenger hjelp. hvordan få 12volt ut ifra min Arduino?

 

Jeg vil helse kjøpe en ferdig løsning ser de har slike:

http://www.dx.com/p/1-channel-12v-relay-module-for-arduino-red-156088

http://www.dx.com/p/12v-high-level-trigger-relay-module-for-arduino-blue-152390#.U4hsJSjEDko

 

Jeg skjønner ikke åssen jeg kobler disse til å fungere?

Fint hvis noen vet kan komme med en godforklaring på hvordan jeg løser mitt problem :)?

Lenke til kommentar

Trenger hjelp. hvordan få 12volt ut ifra min Arduino?

 

Jeg vil helse kjøpe en ferdig løsning ser de har slike:

http://www.dx.com/p/1-channel-12v-relay-module-for-arduino-red-156088

http://www.dx.com/p/12v-high-level-trigger-relay-module-for-arduino-blue-152390#.U4hsJSjEDko

 

Jeg skjønner ikke åssen jeg kobler disse til å fungere?

Fint hvis noen vet kan komme med en godforklaring på hvordan jeg løser mitt problem :)?

 

Du får ikke 12volt ut av Arduino pinnene uten en transistor av noe slag imellom. De relèene du linker til bruker en ekstern strømkilde på 12volt som styres av en transistor. Transistoren lar strømmen igjennom når den får 5volt fra arduinoen.

Lenke til kommentar

Trenger hjelp. hvordan få 12volt ut ifra min Arduino?

 

Jeg vil helse kjøpe en ferdig løsning ser de har slike:

http://www.dx.com/p/1-channel-12v-relay-module-for-arduino-red-156088

http://www.dx.com/p/12v-high-level-trigger-relay-module-for-arduino-blue-152390#.U4hsJSjEDko

 

Jeg skjønner ikke åssen jeg kobler disse til å fungere?

Fint hvis noen vet kan komme med en godforklaring på hvordan jeg løser mitt problem :)?

 

Bruk en MOSFET mellom arduinoen og releet. For MOSFET'er har som regel en intern diode som tar knekken på spenningspeaker fra spoler i tilegg, noe ikke en vanlig transistor har.

 

Noe slikt noe:

MOSFETOut.jpg

 

Men du trenger jo selvsagt ikke å bruke akkurat den MOSFET'en da, bare en som tåler strømen som releet trekker uten å måtte ha noe kjøleribbe og har en passelig gate aktiveringsspenning.

Endret av flesvik
  • Liker 1
Lenke til kommentar

Trenger hjelp. hvordan få 12volt ut ifra min Arduino?

 

Jeg vil helse kjøpe en ferdig løsning ser de har slike:

http://www.dx.com/p/1-channel-12v-relay-module-for-arduino-red-156088

http://www.dx.com/p/12v-high-level-trigger-relay-module-for-arduino-blue-152390#.U4hsJSjEDko

 

Jeg skjønner ikke åssen jeg kobler disse til å fungere?

Fint hvis noen vet kan komme med en godforklaring på hvordan jeg løser mitt problem :)?

 

 

Det enkleste er å kjøpe noen som er lagd for arduino:

http://www.dx.com/s/arduino+5v+relay

Lenke til kommentar
  • 2 uker senere...

Jeg klarer ikke å inkludere et bibliotek. Laster ned time.zip, trykker sketch->import Library->add Library->time.zip

Så skal jeg prøve å importere det; sketch->import Library->time.h

Det eneste som skjer er at en blank linje blir satt inn øverst. Har prøvd: #include <time.h> og #include "time.h", men jeg får not declared in this scope når jeg prøver å bruke funksjoner fra time.h.

 

Hva gjør jeg feil og hvorfor får jeg ikke noen feilmeldinger når jeg prøver å importere?

 

 

EDIT: Fungerte når jeg kopierte time.cpp og time.h inn i sketchmappen, måtte restarte arduino IDEen også. Library funksjonaliteten i IDEen bør de bare kutte ut, for noe tull.

Endret av Kirchhoff
Lenke til kommentar
  • 1 måned senere...

Spørsmål til forenkling av krets:

 

A) Jeg har en Arvuino Nano som er matet med 12VDC. På en av de digitale utgangene har jeg hengene en BC337 transistor uten noen form bor motstand for å begrense stømmen mellom Base og Emitter. Dette gikk forbausende bra da jeg testet med korte 10mS pulser og tilsynelatende så var det ikke noe som ble varmt. Testet sikkert rund 50 pulser uten å ødelegge noe. Er dette en teoretisk sett OK måte å gjøre det på?

 

B) På en annen digital utgang (samme krets) har jeg hengende en optokopler av type LTV-817C. Kan denne koples også koples direkte uten noen form for formotstand? (Jeg bruker i dag en formotstand på 22Ohm).

Lenke til kommentar

A)

 

Sett at lasten din er plassert mellom Vcc og kollektor og emitter er koblet til jord vil strømmen som går mellom bas og emitter mer eller mindre kortsluttes til jord. Den blir svært høy og du vil sannsynligvis skade utstyret ditt.

 

Har du plassert lasten din mellom emitter og jord vil lasten din fungere som en strømbegrenser for basis. Det du risikerer nå er at transistoren ikke går i metning (hvis det er hensikten) og strømmen igjennom lasten din blir lavere enn det du egentlig trenger.

 

B)

 

Det samme gjelder her. Du får relativt stor strøm igjennom optokobleren din ved å fjerne motstanden. Praktisk talt en kortslutning.

 

 

Bruk motstander så er du sikker på at prosjektet ditt kommer til å holde. Det blir fort strømmer som er større enn mikrokontrolleren din tåler.

Lenke til kommentar

Jeg sliter litt med programmering av en arduino her, jeg skal styre en servo via kommandoer fra nett, jeg får til å sette arduinoen på nett, få ip, motta kommandoer over telnet, og sende kommandoer til servoen. Utrolig nok er der det strander å ta samle inn det som sendes av kommandoer til en string, som derettes sendes som en integer til servoen, eksempelkoden er kun for å ta imot det som skrives og printe det, så kan jeg utvide.

 

 

 

#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = {
0x90, 0xA2, 0xDA, 0x0D, 0x58, 0x14 };
byte ip[] = { 192, 168, 1, 210 };
 
 
//setter opp server
EthernetServer server(23);
EthernetClient client;
boolean connected = false;
//kommandoen som sendes til serveren
String kommando;
 
void setup() {
 
//starter server
Ethernet.begin(mac, ip);
server.begin();
 
}
//alt over dette virker til å fungere fint.
 
 
void loop() {
   EthernetClient client = server.available();
 
   if (client) {    
   int teller = 0;
   
 while ((bokstav = client.read()) != 'a')  //sjekker om bokstaven a kommer inn, som er satt som escape her, 
//dvs sender jeg 182a, så skal tallet 182 sendes til servoen.
    {     
      kommando += bokstav;
    }
     client.println(kommando);
     
   }
}
//her prøver jeg å gjøre strengen om til en integer

void parseCommand() {
 
 int vinkel = kommando.toInt(); 
client.println(vinkel);
}
Lenke til kommentar

A)

 

Sett at lasten din er plassert mellom Vcc og kollektor og emitter er koblet til jord vil strømmen som går mellom bas og emitter mer eller mindre kortsluttes til jord. Den blir svært høy og du vil sannsynligvis skade utstyret ditt.

 

Har du plassert lasten din mellom emitter og jord vil lasten din fungere som en strømbegrenser for basis. Det du risikerer nå er at transistoren ikke går i metning (hvis det er hensikten) og strømmen igjennom lasten din blir lavere enn det du egentlig trenger.

 

B)

 

Det samme gjelder her. Du får relativt stor strøm igjennom optokobleren din ved å fjerne motstanden. Praktisk talt en kortslutning.

 

 

Bruk motstander så er du sikker på at prosjektet ditt kommer til å holde. Det blir fort strømmer som er større enn mikrokontrolleren din tåler.

Takk for svar. Vil jo ikke ødelegge noe så da setter jeg tilbake motstandene. Mulig det gikk bra siden jeg bare sender ut pulser. (Ja, lasten henger mellom VCC og kollektor).

Lenke til kommentar

Litt tungvindt å måtte lagre det som String for å så endre det til int. Og hvor kaller du parseCommand?

 

Se på dette eksempelet (ikke prøvd det selv):

http://www.baldengineer.com/blog/2012/07/30/arduino-multi-digit-integers/

 

Har modifisert så den tar inn en char-array, men sliter fortsatt, virker som arrayet fylles umiddelbart når jeg telnetter inn til arduinoen, char-arrayet fylles opp med en gang, før jeg rekker å skrive noe.

 

AtW

#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x0D, 0x58, 0x14 };
byte ip[] = { 192, 168, 1, 210 };
 
 
//setter opp server (telnet, port 23)
EthernetServer server(23);
EthernetClient client;
boolean connected = false; 
//kommandoen som skal tas imot av kliten
String kommando;
const byte BUFFER_LENGTH = 3; // make this long enough to hold your longest command
char buffer[BUFFER_LENGTH+1]; // +1 allows space for the null terminator
byte bufferCount;
//char f = "a";
//char g = "b";
//char h = "c";
char testar[4];
 
                         
void setup() {
   
//starter serveren
   Ethernet.begin(mac, ip);
   server.begin();
  
}
 
void loop() {
   // sjekker om klintt kobler seg til
   EthernetClient client = server.available();
 
   //om klienten er på, mota tegn som klienten skriver inn, legg inn tegnene i "kommando", og print kommando
   if (client) {
       
    client.println("Tilkoblet via Telnet");
     testar[0] = 'c';
     testar[1] = 'd';
     testar[2] = 'e';
     client.println(testar);  
     while (client.connected())
        {
            if (client.available())
            {
                char c = client.read();
                if(c == 'a')
                {
                  client.println("char er lik a");  
                  client.println(buffer);  
                  handleMessage(buffer);
                    bufferCount = 0;
                    buffer[bufferCount] = 0;
                    // if you want the server to disconnect the client after receiving the first command, call client.stop(); here
                }
                else
                {
                    if(bufferCount < BUFFER_LENGTH)
                    {
                        buffer[bufferCount++] = c;
                        buffer[bufferCount] = 0; // append null terminator
                        client.println("char er IKKE lik a");  
                    }
                    else
                    {
                        // buffer full - discard received character
                    }
                }
            }
        }
    }
}
 
    
void handleMessage(char *msg)
{
client.println(buffer);
}
Endret av ATWindsor
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...