internet pencereler Android
Genişletmek

Arduino UNO programı çalışan ışıklar oluşturmak için. WS2812 ve Arduino Şerit üzerinde çalışan dönüş sinyalleri

Bu derste, LED'lerle çalışmaya devam edeceğiz, ancak LED sayısı 5'e yükselir ve koşma ateşinin etkisini oluşturur. LED'leri kontrol etmek için, ARDUINO bağlantı noktalarıyla manipülasyon kullanacağız. Arduino bağlantı noktalarında doğrudan veri kaydederiz. Denetleyicinin belirli girişleri / çıkışlarıyla çalışmaktan daha iyidir. Bu, tek başına işlemi kullanarak LED'ler için değerler oluşturmanıza izin verecektir.

Arduino UNO 3 portu var:

  • B (Dijital girişler / 8'den 13'e çıkış)
  • C (Analog Giriş)
  • D (Dijital girişler / 0'dan 7'ye çıkış)

Her bağlantı noktası 3 kayıt tarafından kontrol edilir. DDR kaydı, ayak (PIN) girişinin veya çıkışın nasıl olacağını tanımlar. Bağlantı noktası kaydığında, pimi yüksek veya düşük duruma takabilirsiniz. PIN siciliyle, giriş üzerinde çalışırken Arduino bacaklarının durumunu okuyabilirsiniz.

Bon B'yi kullanacağız. Önce B'nin tüm bacaklarını dijital çıkışlar olarak yüklemeliyiz. B'nin Port'un sadece 6 ayağı vardır. Bağlantı noktalı DDRB için Kayıt Bitleri, ayak bir çıkış (çıkış) olarak kullanılırsa ve ayak giriş (giriş) olarak kullanılıyorsa, bir çıkış (çıkış) ve 0 olarak kullanılıyorsa, 1'e kurulmalıdır. Bağlantı noktaları bitleri 0 ile 7 arasında numaralandırılır, ancak her zaman 8 bacağı da her zaman içermez.

Misal:

DDRB \u003d B00111110; // Bağlantı noktasının portlarını C1 ile 5'te bir çıkış olarak ve bir giriş olarak 0 olarak ayarlayın.

Mikroçip mikrodenetleyicilerinin tam tersi olduğunu lütfen unutmayın. 0 Bit - Ayak bir çıktı olarak çalışır ve 1 - giriş olarak.

Ateşleme projemizde, 5 çıktı kullanacağız:

DDRB \u003d B00011111; // Portun bağlantı noktalarını 0'dan 4'e kadar çıkış olarak ayarlayın.

Bağlantı noktasındaki değerleri kaydetmek için, PORTB Kayıt işlemini kullanmanız gerekir. İlk LED'i döngü Takım olabilir:

PORTB \u003d B00000001;
Birinci ve dördüncü:
PORTB \u003d B00001001;

Artık LED'leri ne kadar kolay açabileceğimiz görebileceğiniz görüyorsunuz. Şimdi size vardiya operatörlerini söyleyin

2 ikili vardiya operatörü vardır: kesme operatörü kaldı<< и оператор сдвига вправо >\u003e. Vardiya operatörü kaldı<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >\u003e Bitleri sağa kaydırır.

Misal:

Varo \u003d 1; // 00000001.
Vara \u003d 1.<< 0; // 00000001
Vara \u003d 1.<< 1; // 00000010
Vara \u003d 1.<< 2; // 00000100

Şimdi aşağıda gösterilen programımıza geri dönün. 2 değişken girmemiz gerekir: ilk yukarı aşağı. taşınabileceği bir değer içerecek - yukarı veya aşağı, ikincisi cylon. Aydınlanmak için hangi LED'ler.

Fonksiyonunda kurulum () Hangi bacakların çıkış olarak çalışması gerektiğini tanımlarız.

Programın ana döngüsünde döngü (), LED'ler değişkeni artırarak yanar cylon.ve en üstteki gelince, sonra değişken yukarı aşağı. 0 atar ve LED'ler sırayla yanar.

Bu deneyde, ışığı LED ölçeğinde çalışmaya zorluyoruz.

Deney için parçaların listesi

- 1 Arduino UNO kartı;

- 1 Dahil Boşaltma Kurulu;

- 1 led skala;

- 220 ohm yüz değerine sahip 10 direnç;

- 11 papa papa telleri.

Şematik şeması

Erkek üzerinde şema

Taslak

arduino IDE için Kroki İndirin
// led skala, bir arka arkaya yerleştirilmiş bir pin grubuna bağlanır. İlk ve son vuruşlara net isimler veriyoruz #define first_led_pin 2 #define last_led_pin 11 boşluk () () (// 10 LED'lik bir ölçekte. Fakat kodu daralır ve // \u200b\u200bdaha problemli hale getirmesini sağlayacaktır. // ön bisiklet kullanmak daha iyidir. // her Pina (değişken PIN) // için ilk (\u003d first_led_pin) ) son kapsayıcı // (<= LAST_LED_PIN), всякий раз продвигаясь к следующему // (++pin увеличивает значение pin на единицу) // Так все пины от 2-го по 11-й друг за другом станут выходами for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin) pinMode(pin, OUTPUT); } void loop() { // получаем время в миллисекундах, прошедшее с момента // включения микроконтроллера unsigned int ms = millis(); // нехитрой арифметикой вычисляем, какой светодиод // должен гореть именно сейчас. Смена будет происходить // каждые 120 миллисекунд. Y % X — это остаток от // деления Y на X; плюс, минус, скобки — как в алгебре. int pin = FIRST_LED_PIN + (ms / 120) % 10; // включаем нужный светодиод на 10 миллисекунд, затем — // выключаем. На следующем проходе цикла он снова включится, // если гореть его черёд, и мы вообще не заметим отключения digitalWrite(pin, HIGH); delay(10); digitalWrite(pin, LOW); }

CODA'ya Açıklama

  • Bir ifade kullanarak İçin Organize ediyoruz metre ile döngü . Bu durumda, bağlantı noktalarını çıkışa ayarlamak için. Böyle bir döngü yapmak için ihtiyacınız var:
    • Orijinal değerini atayan değişken sayacını başlatın. Bizim durumumuzda: int pin \u003d first_led_ TOPLU İĞNE. ;
    • Başarı, tekrarlanan döngü olacak olana kadar durumu belirtin. Bizim durumumuzda: tOPLU İĞNE.<= LAST_LED_ TOPLU İĞNE. ;
    • Sayacın değiştirileceği kuralını belirleyin. Bizim durumumuzda ++ pin. (Operatör için aşağıya bakınız ++ ).
  • Örneğin, bir döngü yapabilirsiniz. için (int i \u003d 10; i\u003e 0; i \u003d i - 1) . Bu durumda:
    • Değişken ben atanmış değer 10 ;
    • Bu değer durumu karşılar ben\u003e 0. ;
    • Bu nedenle, döngü içine yerleştirilen kod bloğu ilk kez gerçekleştirilir;
    • Değer vermek bEN. Belirtilen kurala göre birim başına azalır ve değeri alır 9 ;
    • Kod bloğu ikinci kez gerçekleştirilir;
    • Her şey tekrar tekrar tekrar tekrarlanır. bEN. eşit 0 ;
    • Ne zaman bEN. eşit olacak 0 , Durum ben\u003e 0. tamamlanmadı ve döngünün yürütülmesi sona erecek;
    • Kontrolör döngüsünün ardından koda gidecektir İçin ;
  • Bir çift kıvırcık parantez arasında döndürülmesi gereken kodu yerleştirin. {} Birden fazla talimat varsa;
  • Operatörde ilan edilen sayaç değişkeni İçin döngünün içinde kullanılabilir. Örneğin, bu deneyde tOPLU İĞNE. sürekli olarak 2 ila 11 arasında değerler alır ve pinmode. 10 bağlantı noktasını döngüye yerleştirilen bir satırda ayarlamanızı sağlar;
  • Değişkenler sayaçları sadece dönemin içinde görülebilir. Şunlar. Eğer dönersen tOPLU İĞNE. Döngünüzden önce veya sonra derleyici, bildirilmemiş değişken hakkında bir hata verecektir;
  • Tasarlamak i \u003d ben - 1 Yukarıdaki açıklama denklem değil! Atama operatörünü \u003d değişkende kullanmak için kullanıyoruz bEN. Değeri geçerli değere eşit yerleştirin bEN. azaltılmış 1 ;
  • İfade ++ pin. - Bu sözde. Şebeke artış değişkene uygulanır tOPLU İĞNE. . Bu talimat aynı sonucu pin \u003d pin + 1 olarak verecektir;
  • Artış iş operatörüne benzer dost - - Birim başına değeri azaltma. Aritmetik işlemlerle ilgili makalede bu konuda daha fazla bilgi;
  • Veri tipi imzasız int. Tamsayıları işaretsiz saklamak için kullanılır, yani. sadece negatif olmayan . İşareti saklamak için artık kullanılmayan ekstra bit nedeniyle, bu tür bir değer değişkeninde saklayabiliriz. 65 535 ;
  • İşlev milis. Mikrodenetleyicinin dahil edilmesinden veya yeniden başlatılmasından bu yana geçen milisaniye sayısını döndürür. Burada, LED'lerin değiştirilmesi arasında zamana atıfta bulunmak için kullanıyoruz;
  • Bir ifade kullanarak (MS / 120)% 10 Şimdi 10 LED'ten hangisinin yandığını tanımlarız. Praprazing, 120 ms uzunluğundaki uzunluğu ve mevcut onun içindeki numarasının ne olduğunu tanımlarız. Geçerli sette önce çıkıntı yapan port numarasına segmentin bir bölüm numarası ekliyoruz;
  • LED'in yardımıyla benzin digitalwrite (Pin, Düşük) Toplamda, açıldıktan sonra 10 ms göze dikkat çekmemektedir, çünkü Çok yakında tekrar açılacak LED'lerden hangisini hesaplayacak ve açık olacak - sadece kurtarılacak ya da bir sonraki.

Kendinizi kontrol etmek için sorular

  1. Neden bu deneyde, LED ölçeğini transistörü kullanmadan bağlıyoruz?
  2. LED'leri yalnızca 5, 6, 7, 8, 9 numaralı bağlantı noktalarına dahil edersek, programda değişmek için ne gerekli olurdu?
  3. Başka bir talimatın eşdeğerini gerçekleştirebileceğiniz yardımı ile ++ pin. ?
  4. Tür değişkenleri arasındaki fark nedir int. ve imzasız int. ?
  5. İşlevi iade eden şey milis () ?
  6. Bu deneyde, LED'i açmak için ihtiyacınız olan port numarasını hesaplarız?

Kendi kendine kararlar için görevler

  1. Kodu değiştirin, böylece LED'ler saniyede bir kez geçer.
  2. Bağlantı noktaları kapatmayın, böylece ışıklar sadece orta dört bölümden oluşan.
  3. Programın uzaklaştırılması için int pin \u003d first_led_ TOPLU İĞNE. + (MS / 120)% 10 Işığın hareketi döngüsü sürdü İçin .
  4. Telleri değiştirmeden, programın ters yönde koşması için programı değiştirin.

Şematik şeması

Katmandaki şema

Not

    Lütfen bu deneyde, dirençlerin, pulsar deneyinin aksine katotlar ve aralar arasında yüklü olduğunu unutmayın.

    LED'leri, 2 numaralı bağlantı noktasından başlayarak dijital bağlantı noktalarına bağlıyoruz. Portlar 0 ve 1'i kullanabiliriz, ancak veri iletim kanallarının kanallarıdır ve her bir yanaşma tahtası için bunlara bağlı cihazları kapatmak zorunda kalacaktır.

Taslak

İmzasız int veri türü, tam sayıları işaretsiz depolamak için kullanılır, yani. sadece negatif olmayan. Şu anda işaretini saklamak için kullanılmayan ekstra bit nedeniyle, bu tür bir değer değişkeninde 65,535'e kadar saklayabiliriz.

İfadeyi kullanma (MS / 120)% 10, biz şimdi 10 LED'ten hangisinin yandığını belirliyoruz. Praprazing, 120 ms uzunluğundaki uzunluğu ve mevcut onun içindeki numarasının ne olduğunu tanımlarız. Segmentin segment numarasını, geçerli sette ilk önce çıkıntı yapan bağlantı noktasına ekleriz.

Açıldıktan sadece 10 ms'de sadece 10 ms'de LED tarafından DigitalWrite (Pin, Düşük) ile söndürüldüğümüz, göze dikkat çekmemiz, çünkü Çok yakında tekrar açılacak LED'lerden hangisini hesaplayacak ve açık olacak - sadece kurtarılacak ya da bir sonraki.

Kendinizi kontrol etmek için sorular

    Neden bu deneyde, LED ölçeğini transistörü kullanmadan bağlıyoruz?

    LED'leri yalnızca 5, 6, 7, 8, 9 numaralı bağlantı noktalarına dahil edersek, programda değişmek için ne gerekli olurdu?

    Hangi diğer talimatlarla, ++ pin'e eşdeğer bir eylem yapabilirsiniz?

    Int ve imzasız int değişkenleri arasındaki fark nedir?

    Millis () işlevini ne verir?

    Bu deneyde, LED'i açmak için ihtiyacınız olan port numarasını hesaplarız?

Bu derste, LED'lerle çalışmaya devam edeceğiz, ancak LED sayısı 5'e yükselir ve koşma ateşinin etkisini oluşturur. LED'leri kontrol etmek için, ARDUINO bağlantı noktalarıyla manipülasyon kullanacağız. Arduino bağlantı noktalarında doğrudan veri kaydederiz. Denetleyicinin belirli girişleri / çıkışlarıyla çalışmaktan daha iyidir. Bu, tek başına işlemi kullanarak LED'ler için değerler oluşturmanıza izin verecektir.

Arduino UNO 3 portu var:
B (Dijital girişler / 8'den 13'e çıkış)
C (Analog Giriş)
D (Dijital girişler / 0'dan 7'ye çıkış)

Her bağlantı noktası 3 kayıt tarafından kontrol edilir. Ddr kayıt Bacağın (PIN) giriş veya çıkışı nasıl olacağını belirler. Bağlantı Noktası Kaydı ile PIN'i bir duruma kurabilirsiniz. Yüksek veya Düşük.. PIN siciliyle, giriş üzerinde çalışırken Arduino bacaklarının durumunu okuyabilirsiniz.

Bon B'yi kullanacağız. Önce B'nin tüm bacaklarını dijital çıkışlar olarak yüklemeliyiz. B'nin Port'un sadece 6 ayağı vardır. Bağlantı noktalı DDRB için Kayıt Bitleri, ayak bir çıkış (çıkış) olarak kullanılırsa ve ayak giriş (giriş) olarak kullanılıyorsa, bir çıkış (çıkış) ve 0 olarak kullanılıyorsa, 1'e kurulmalıdır. Bağlantı noktaları bitleri 0 ile 7 arasında numaralandırılır, ancak her zaman 8 bacağı da her zaman içermez.
Misal:
DDRB \u003d B00111110; // Bağlantı noktasının portlarını C1 ile 5'te bir çıkış olarak ve bir giriş olarak 0 olarak ayarlayın.

Mikroçip mikrodenetleyicilerinin tam tersi olduğunu lütfen unutmayın. 0 Bit - Ayak bir çıktı olarak çalışır ve 1 - giriş olarak.

Ateşleme projemizde, 5 çıktı kullanacağız:
DDRB \u003d B00011111; // Portun bağlantı noktalarını 0'dan 4'e kadar çıkış olarak ayarlayın.

Bağlantı noktasındaki değerleri kaydetmek için, PORTB Kayıt işlemini kullanmanız gerekir.
İlk LED'i döngü Takım olabilir:
PORTB \u003d B00000001;
Birinci ve dördüncü:
PORTB \u003d B00001001;

Artık LED'leri ne kadar kolay açabileceğimiz görebileceğiniz görüyorsunuz. Şimdi size vardiya operatörlerini söyleyin

2 ikili vardiya operatörü vardır: kesme operatörü kaldı<< и оператор сдвига вправо >\u003e. Vardiya operatörü kaldı<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >\u003e Bitleri sağa kaydırır.

Misal:
varo \u003d 1; // 00000001
Vara \u003d 1.<< 0; // 00000001
Vara \u003d 1.<< 1; // 00000010
Vara \u003d 1.<< 2; // 00000100

Şimdi aşağıda gösterilen programımıza geri dönün.
2 değişken girmemiz gerekiyor: İlk Updown, taşınacak ya da aşağı hareket edeceği bir değer içerecektir ve bu da LED'lerin ışığı olan ikinci silindir.

Fonksiyonunda kurulum () Hangi bacakların çıkış olarak çalışması gerektiğini tanımlarız.

Programın ana döngüsünde döngü (), LED'ler değişkeni artırarak yanar cylon.ve en üstteki gelince, sonra değişken yukarı aşağı. 0 atar ve LED'ler sırayla yanar.

/ * Ateşli ateş. 5 LED * / İmzasız Char Updown \u003d 1; // İmzasız Char Cylon \u003d 0 hareketi ile başla; // LED Void Setup () () 'nin sırasını belirler (DDRB \u003d B00011111; // BOD B'yi 0'dan 4'e çıkış olarak ayarlayın) Void Loop () (eğer (Updown \u003d\u003d 1) (// Eğer yukarı gidersek Cylon ++; eğer (eğer (cylon\u003e \u003d 4) Updown \u003d 0; // ise, en büyük LED numarasının ulaşıldığında, sonra bir sonraki. Döngü aşağı iner) Diğer (Cylon--; Eğer (Cylon \u003d\u003d 0) Updown \u003d 1; // En küçük LED numarasının ulaşıldığında, bir sonraki. Döngü GO up) PORTB \u003d 1<< cylon; //сдвиг delay(200); // пауза 200 мс }

Biraz daha şımarık LED'i alalım. Arduino LED'lerinizle soldan sağa ve sağa doğru yanıp sönen ve bir tane değil, sekiz parça kullanarak oluşturalım. 1-2-3-4-4-3-2-1-2-3-3-3-4-3-2-1-2-3-3-3-3-2-1-2-3 - ... ile bir sonsuz sekans döngüsünde LED'lerin yanıp sönmesini sağlayalım. Birinde gecikme bana bir saniye ver.
İhtiyacın olacak:

  • Standart Arduino ayarlarınız (bilgisayar, kablo, uno veya uyumlu)
  • 8 ışık yayan diyotlar.
  • 8 Dirençler 360 Ohm 0.25 W. Mevcut LED'leri sınırlamak için dirençler gereklidir.
  • Plata ve bağlantı kablosu yap
Değişken bir gecikme yapmayı öneriyorum. Böylece kolayca değiştirebilirsiniz .
Massimo bankaları kitabında açıklanan "yanıp sönen LED" ilk projesinde, dijital çıkış 13 kullanılmıştır. Bu sefer 2 ila 9 arasında dijital temaslar kullanabilirsiniz. Donanım tarafı basittir - Teli her dijital temastan bağlayın LED anot, ardından bağlantı teli direnç 360 om direnişini ve LED'ün LED'inin daha fazla katotunu bağlayın. Aşağıdaki şemaya bakın:

Şimdi görevin kod yazmak! Ancak bunu yapmadan önce, bir iş planı veya algoritma yazmanız gerekir. Örneğin, bu egzersiz için, gibi bir şey yazabilirsiniz ...

Programın 0.1 algoritması.
Tüm temasları, çıktı olarak kullanacağımızın yüklenmesi Milisaniyede gecikme süresini depolamak için bir değişken oluşturun Sonsuz tekrarlanan döngüyü başlatıyoruz İletişim 2'yi açın, ayarlanan gecikme süresini bekleyin, kapatın İletişim 3'i açın, ayarlanan gecikme süresini bekleyin, kapatın Bu işlemleri diğer çıktılar için tekrarlayın - 4-9 O zaman aynısını yapın, ancak temas 3'e karşı ters yönde Sonsuz bir döngünün sonu Sana ne oldu? Hiçbir şeyin olmasaydı, korkunç yok. Böylece öğrenin. Ancak aşağıda zamanınızı kaydetmek için bu şemanın kodunu gösterir..

İnt del \u003d 100; // varsayılan bir gecikme süresi, 100 milisaniye (bir saniyenin onda biri) ayarlar
void kurulumu ()
{
// dijital pimleri çıktı olarak başlat:
// daha sonra bunu yapmak için daha kolay yollar olacak
Pinmode (2, çıkış);
Pinmode (3, çıkış);
Pinmode (4, çıkış);
Pinmode (5, çıkış);
Pinmode (6, çıkış);
Pinmode (7, çıkış);
Pinmode (8, çıkış);
Pinmode (9, çıkış);
}
// LOOP () yöntemi, gücü kapatana kadar süresiz olarak tekrarlanır.
boşluk döngüsü ()
{
Digitalwrite (2, yüksek); // pim 2'de LED'i aç
Gecikme (del); // Bekleyin ("DEL" değerinin belirlendiği uzunluk))
Digitalwrite (2, düşük); // Kapatmak

Gecikme (del); // Bekle.


Gecikme (del); // Bekle.


Gecikme (del); // Bekle.


Gecikme (del); // Bekle.


Gecikme (del); // Bekle.


Gecikme (del); // Bekle.

Digitalwrite (9, yüksek); // pim 9'da LED'i aç
Gecikme (del); // Bekle.
Digitalwrite (9, düşük); // Kapatmak
Digitalwrite (8, yüksek); // PIN 8'de LED'i açın
Gecikme (del); // Bekle.
Digitalwrite (8, düşük); // Kapatmak
Digitalwrite (7, yüksek); // PIN 7'de LED'i açın
Gecikme (del); // Bekle.
Digitalwrite (7, düşük); // Kapatmak
Digitalwrite (6, yüksek); // PIN 6 üzerindeki LED'i açın
Gecikme (del); // Bekle.
Digitalwrite (6, düşük); // Kapatmak
Digitalwrite (5, yüksek); // PIN 5 üzerindeki LED'i açın
Gecikme (del); // Bekle.
Digitalwrite (5, düşük); // Kapatmak
Digitalwrite (4, yüksek); // pim 4'teki LED'i açın
Gecikme (del); // Bekle.
Digitalwrite (4, düşük); // Kapatmak
Digitalwrite (3, yüksek); // pim 3'teki LED'i açın
Gecikme (del); // Bekle.
Digitalwrite (3, düşük); // Kapatmak