Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Początek z Arduino uno. Pierwsze programy

tom.tych 25 Mar 2018 14:24 891 20
  • #1 25 Mar 2018 14:24
    tom.tych
    Poziom 11  

    Witam serdecznie.
    do tej pory opierałem się na języku bascom i podstawowe cele które chciałem opanowałem. Postanowiłem spróbować tego samego ale na Arduino. I tu urodził się problem. Ciężko jest mi się przestawić. Korzystając z gotowych kursów nie znalazłem odpowiedzi na swoje pytania, lub nie wyszło bo efektów brak ;(. Proszę o pomoc w prostych programach.

    1. Jak zadeklarować cały port by uniknąć tego całego pisania zamykając treść do minimum:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    2. Jak zadeklarować port by uniknąć kolejnej pisaniny:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    W bascom "bawiąc się" mogę robić tak tak:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Gdybym chciał taki ciąg zapisać metodą wyżej w arduino to 3 dni pisania...

    Chyba jest jakiś sposób by zapisać komendę w stylu:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Jeżeli ktoś będzie miał trochę cierpliwości to zapraszam do zabawy ponieważ chcę spróbować wszystkich możliwych sposobów wysterowania diody led

    0 20
  • CControls
  • #2 25 Mar 2018 14:46
    JacekCz
    Poziom 36  

    Teoria:
    padłes ofiarą koncepcji jednobitowego 'digital portu' w arduiono. W rzeczywistości jest to opakowanie, warstwa programowa, nad ośmiobitowym portem jaki znasz.
    To się sprawdza przy miganiu jednym LED, sterowaniu jednego bitu, ale nie w Twoim zagadnieniu

    Praktykę może ktoś zaproponuje.

    0
  • #3 25 Mar 2018 15:30
    tom.tych
    Poziom 11  

    Chciałem wysterować diody przy pomocy pwm nadmienię że aż 5 szt. metodą którą na razie tylko znam. O to efekty:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Prawie jak poemat... a efekt hmmm przerost treści nad formą :)
    JacekCz napisał:
    W rzeczywistości jest to opakowanie, warstwa programowa, nad ośmiobitowym portem jaki znasz.


    to co z tym można począć? Bo sama platforma jest fajna, wygodna. Dopiero poznaje środowisko może jednak mimo wszystko jest jakaś możliwość optymalizacji, zastosowania jakiegoś obejścia. Jeszcze nie próbowałem ale czy można Arduino wykorzystać przy bascomie?

    Jak zrobić inaczej by dioda zapalała się kolejno przy czym wcześniejsze gasną?
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #4 25 Mar 2018 16:36
    NoweMillennium
    Poziom 17  

    tom.tych napisał:
    Jak zadeklarować cały port by uniknąć tego całego pisania zamykając treść do minimum:

    np
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [minuty]:

    tom.tych napisał:
    Jak zadeklarować port by uniknąć kolejnej pisaniny:

    np
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 25 Mar 2018 17:07
    JacekCz
    Poziom 36  

    Zainspirowany przejrzałem żróła arduino,
    Szczerze mówiąc nie jest to framerwork który cenię za profesjpnalny sposób zaprojektowania, ale oczekiwałem bardziej 'obiektowego' designu portów, a to siedzi w C - trochę gorzej niż się spodziewałem.
    Tu masz dla ciekawości implementację dyskutowanej funkcji:

    https://github.com/arduino/Arduino/blob/maste...re/arduino/avr/cores/arduino/wiring_digital.c

    Ciekawe, czy przyda Ci się funkcja. Nigdy się z nią nie zaznajamiałem, ale trochę podobna do Twoich założeń.
    void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)

    https://github.com/arduino/Arduino/blob/maste...ware/arduino/avr/cores/arduino/wiring_shift.c

    0
  • CControls
  • #6 27 Mar 2018 00:29
    tom.tych
    Poziom 11  

    Co zrobić by po spełnieniu funkcji

    Kod: c
    Zaloguj się, aby zobaczyć kod

    układ liczył wg wytycznych na początku a nie czekał 5[s]? Układ fajnie liczy do 21 potem czeka 5[s] jak chciałem a potem już te 5[s] ciągnie się przez cały czas.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 27 Mar 2018 06:36
    emarcus
    Poziom 35  

    tom.tych napisał:
    Co zrobić by po spełnieniu funkcji
    Kod: c
    Zaloguj się, aby zobaczyć kod

    układ liczył wg wytycznych na początku a nie czekał 5[s]?

    Rozszerz więc ten warunek z logicznym operatorem, tak aby był on wykonywany jednorazowo przy określonym liczniku na przykład:
    if (j>=21 && j < 22) // 5-secundowy delay po 21
    albo
    if (j>21 && j<23) // 5-secundowy delay po 22
    W miejsce operatora logicznego && możesz próbowac zastosowac operatora bitowego &.

    e marcus

    0
  • #8 27 Mar 2018 10:45
    JacekCz
    Poziom 36  

    emarcus napisał:

    if (j>21 && j<23) // 5-secundowy delay po 22
    W miejsce operatora logicznego && możesz próbowac zastosowac operatora bitowego &.



    To jest nieprawidłowa rada, logiczny a bitowy to zupełnie inne działanie.

    A co do nieszczęsnej stałej 23, gdyby to był mój algorytm bym to bardziej wyraziście rozwiązał, albo przez zmianę stanu w postaci zmiennej 'przerwa już była', albo ją po delay() zerował. Nie wiem co autor miał na myśli. Algorytmika w Bascom jest taka sama jak w C.

    0
  • #9 27 Mar 2018 13:56
    tom.tych
    Poziom 11  

    Zadanie proste. Dioda zaczyna mrugać z częstotliwością 1[s]. Naliczając mrugnięcia skraca czas dając efekt szybszego mruganua. Po osiagnieciu czasu 0.2 s efekt odrotny. Po dotarciu do czasu 1s przerwa 5s i od początku.

    0
  • #10 27 Mar 2018 14:25
    JacekCz
    Poziom 36  

    tom.tych napisał:
    Zadanie proste. Dioda zaczyna mrugać z częstotliwością 1[s]. Naliczając mrugnięcia skraca czas dając efekt szybszego mruganua. Po osiagnieciu czasu 0.2 s efekt odrotny. Po dotarciu do czasu 1s przerwa 5s i od początku.


    Bez urazy, ale dlaczego algorytm tego nie wyraża? Wydaje się strzelaniem na ślepo.
    Wg tego co napisałeś na początku, masz sobie poradzić z tym w Basicu, potem możesz"przetranslować" na Adruino C++.
    Nazwy zmiennych które w najlepszy możliwy sposób oddają ich sens, to (bardzo) pomaga.

    Z fofmalizmów, podrzucę coś co jest legalne a nielubiane w Arduino:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #12 27 Mar 2018 15:51
    tom.tych
    Poziom 11  

    JacekCz napisał:
    Bez urazy, ale dlaczego algorytm tego nie wyraża? Wydaje się strzelaniem na ślepo.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Pisze amatorsko dlatego taki chaos. Ale warunki spełnione;) bascom zostawiam na boku. Interesuje mnie tylko arduino.
    JacekCz napisał:
    potem możesz"przetranslować" na Adruino C++.

    A jak jeśli można wiedzieć?

    0
  • #13 15 Kwi 2018 17:03
    tom.tych
    Poziom 11  

    Czy można jakość zoptymalizować program ale na poziomie nowicjusza?
    W układzie wykorzystuje 3 czujniki temp. ds18b20. Przy temp.poniżej 26*C ma załączyć didę. Powyżej gasi. Czy można deklarować liczby dziesiętne? Tylko jak?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #14 17 Kwi 2018 13:46
    ditomek
    Poziom 20  

    Kilka oczywistych oczywistości na temat DS
    odczytane dwa bajty zawierające temperaturę zestawione razem w zmienną o długości 16 bitów dają w efekcie integera.
    Integer to jak wiadomo liczba ze znakiem więc wystarczy tylko odciąć ułamek przez podzielenie przez 16 (bo część ułamkowa to w DSie 4 bity) i masz gotową wartość w stopniach celsjusza.

    Jeśli cześć ułamkowa nie jest ci potrzebna (w wielu przypadkach tak jest bo dokładność DSa to 0,5 stopnia) to możesz taką temperaturę zapisana w Integrze porównywać w prosty sposób z innymi liczbami całkowitymi. Najwygodniej z integerami bo masz od razu pełny dostępny zakres.
    Jeśli chcesz zachować ułamek to temperatury nie dziel przez 16 tylko do porównań zastosuj progi pomnożone przez 16(lub odpowiednio zgodnie z potrzebą).
    Nie wiem czy można prościej...

    PS.

    Z doświadczenia wiem, że najlepiej jak temp sprowadzi się do integera w takiej postaci, że najmłodsza liczba w zapisie dziesiętnym odpowiada części ułamkowej.
    Np. liczba 123 to tak naprawdę 12,3 stopnia....

    0
  • #15 18 Kwi 2018 00:15
    NoweMillennium
    Poziom 17  

    tom.tych napisał:
    Czy można deklarować liczby dziesiętne?

    Nie. C nie wspiera liczb dziesiętnych (BCD).

    0
  • #16 18 Kwi 2018 09:57
    tom.tych
    Poziom 11  

    Dzięki. Spróbuję tej metody z

    ditomek napisał:
    Np. liczba 123 to tak naprawdę 12,3 stopnia....
    .

    0
  • #17 06 Maj 2018 22:33
    tom.tych
    Poziom 11  

    Potrzebuje pomocy przy komunikacji UART i przy sparowanym bluetooth HC-06. Wszystko działa na poziomie odbierania danych czy też gotowe programy sterują serwem czyli wszystko gra, tylko problem jest z samym programem w arduino:
    *Przesuwając suwak w aplikacji, program wysyła ciąg znaków A00, A100 itp.
    Literki "AXX" mogę dobrowolnie zmieniać. Pierwszym literką przypisałem odpowiednie serwa:
    A-serwo.1
    B- serwo.2
    C- serwo.3
    D-serwo.4
    Zmieniając suwak w aplikacji program wysyła : A19, B40, C100.
    Jak napisać, albo czy ktoś mógłby mi podać gotowca który odbierze te dane i przetworzy je na pozycję dla serwa?
    A może są inne sposoby?

    0
  • #18 07 Maj 2018 10:05
    NoweMillennium
    Poziom 17  

    Użyj funkcji map i servo.write

    0
  • #19 07 Maj 2018 21:57
    tom.tych
    Poziom 11  

    Pewnie jest problem ze zgodnością zmienny string->int.
    Ale nie wiem czy zastąpić;(
    Początek z Arduino uno. Pierwsze programy

    0
  • #20 07 Maj 2018 23:32
    3149400
    Użytkownik usunął konto  
  • #21 03 Cze 2018 16:04
    darex120
    Poziom 18  

    Może troszke z innej beczki ale nie wiem dlaczego nie moge założyc nowego tematu wiec jak by co przepraszam.

    Witam Serdecznie

    Zbudowałem sobie nadajnik i odbiornik 2,4 Ghz z modółem NRF24l01 , sterowanie serwomechanizmami wszystko ładnie pięknie działa , lecz chodzi mi jeszcze o zastosowanie bezprzewodowo 2 przełączników i za nic w świecie nie wiem w jaki sposób to zrobić , przeglądałem fora , kursy i ni jak nie mam pojęcia w jaki sposób to wykonać. Czy moglibyście mi w jakiś sposób wytłumaczyć jak to zrobić , jak wkleić do kodu nadajnika i odbiornika obsługę przycisków ,poniżej podaję kody może komuś się także przyda.

    NADAJNIK

    Code:


     
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>

    /*Create a unique pipe out. The receiver has to
      wear the same unique code*/
     
    const uint64_t pipeOut = 0xE8E8F0F0E1LL;

    RF24 radio(9, 10); // select  CSN  pin

    // The sizeof this struct should not exceed 32 bytes
    // This gives us up to 32 8 bits channals
    struct MyData {
      byte throttle;
      byte yaw;
      byte pitch;
      byte roll;
      byte AUX1;
      byte AUX2;
    };

    MyData data;

    void resetData()
    {
      //This are the start values of each channal
      // Throttle is 0 in order to stop the motors
      //127 is the middle value of the 10ADC.
       
      data.throttle = 0;
      data.yaw = 0;
      data.pitch = 0;
      data.roll = 0;
      data.AUX1 = 0;
      data.AUX2 = 0;
    }

    void setup()
    {
      //Start everything up
      radio.begin();
      radio.setAutoAck(false);
      radio.setDataRate(RF24_250KBPS);
      radio.openWritingPipe(pipeOut);
      resetData();
    }

    /**************************************************/

    // Returns a corrected value for a joystick position that takes into account
    // the values of the outer extents and the middle of the joystick range.
    int mapJoystickValues(int val, int lower, int middle, int upper, bool reverse)
    {
      val = constrain(val, lower, upper);
      if ( val < middle )
        val = map(val, lower, middle, 0, 128);
      else
        val = map(val, middle, upper, 128, 255);
      return ( reverse ? 255 - val : val );
    }

    void loop()
    {
      // The calibration numbers used here should be measured
      // for your joysticks till they send the correct values.
      data.throttle = mapJoystickValues( analogRead(A0), 34, 544, 1020, true );




      data.yaw      = mapJoystickValues( analogRead(A1),  34, 545, 1020, true );
      data.pitch    = mapJoystickValues( analogRead(A2), 12, 544, 1021, true );
      data.roll     = mapJoystickValues( analogRead(A3), 34, 522, 1020, true );
      data.AUX1     = digitalRead(7);
      data.AUX2     = digitalRead(8);

      radio.write(&data, sizeof(MyData));
    }



    ODBIORNIK

    Code:




    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <Servo.h>

    //Define widths
    int pwm_width_2 = 0;
    int pwm_width_3 = 0;
    int pwm_width_4 = 0;
    int pwm_width_5 = 0;
    int pwm_width_6 = 0;
    int pwm_width_7 = 0;

    Servo PWM2;
    Servo PWM3;
    Servo PWM4;
    Servo PWM5;
    Servo PWM6;
    Servo PWM7;

                        //We could use up to 32 channels
    struct MyData {
    byte throttle;      //We define each byte of data input, in this case just 6 channels
    byte yaw;
    byte pitch;
    byte roll;
    byte AUX1;
    byte AUX2;
    };
    MyData data;


    const uint64_t pipeIn = 0xE8E8F0F0E1LL;     //Remember that this code is the same as in the transmitter
    RF24 radio(9, 10);



    void resetData()
    {
    //We define the inicial value of each data input
    //3 potenciometers will be in the middle position so 127 is the middle from 254
    data.throttle = 1;
    data.yaw = 127;
    data.pitch = 0;
    data.roll = 127;
    data.AUX1 = 0;
    data.AUX2 = 0;
    }

    /**************************************************/

    void setup()
    {
      //Set the pins for each PWM signal
      PWM2.attach(2);
      PWM3.attach(3);
      PWM4.attach(4);
      PWM5.attach(5);
      PWM6.attach(6);
      PWM7.attach(7);

      //Configure the NRF24 module
      resetData();
      radio.begin();
      radio.setAutoAck(false);
      radio.setDataRate(RF24_250KBPS); 
      radio.openReadingPipe(1,pipeIn);
     
      //we start the radio comunication
      radio.startListening();
    }

    /**************************************************/

    unsigned long lastRecvTime = 0;

    void recvData()
    {
    while ( radio.available() ) {
    radio.read(&data, sizeof(MyData));
    lastRecvTime = millis(); //here we receive the data
    }
    }

    /**************************************************/

    void loop()
    {
    recvData();
    unsigned long now = millis();
    //Here we check if we've lost signal, if we did we reset the values
    if ( now - lastRecvTime > 1000 ) {
    // Signal lost?
    resetData();
    }

    pwm_width_2 = map(data.throttle, 0, 255, 1000, 2000);     //PWM value on digital pin D2
    pwm_width_3 = map(data.yaw,      0, 255, 1000, 2000);     //PWM value on digital pin D3
    pwm_width_4 = map(data.pitch,    0, 255, 1000, 2000);     //PWM value on digital pin D4
    pwm_width_5 = map(data.roll,     0, 255, 1000, 2000);     //PWM value on digital pin D5
    pwm_width_6 = map(data.AUX1,     0, 255, 1000, 2000);     //PWM value on digital pin D6
    pwm_width_7 = map(data.AUX2,     0, 255, 1000, 2000);     //PWM value on digital pin D7


    //Now we write the PWM signal using the servo function
    PWM2.writeMicroseconds(pwm_width_2);
    PWM3.writeMicroseconds(pwm_width_3);
    PWM4.writeMicroseconds(pwm_width_4);
    PWM5.writeMicroseconds(pwm_width_5);
    PWM6.writeMicroseconds(pwm_width_6);
    PWM7.writeMicroseconds(pwm_width_7);


    }//Loop end
    /**************************************************/

    0