• Arduino programlama dili. Arduino - Programlamanın Temelleri

    Arduino'nun temel unsurları ile tanıştıktan ve “Merhaba Dünya!” Programını yazdıktan sonra. programlama diline alışmanın zamanı geldi.

    Dilin yapısı öncelikle C/C++'a dayanmaktadır, bu nedenle daha önce bu dilde programlama yapmış olanlar Arduino programlamada ustalaşmakta zorlanmayacaktır. Geri kalanı, kontrol komutları, veri türleri ve işlevleri hakkında temel bilgileri öğrenmelidir.

    Burada yer alan bilgilerin çoğu, veri türlerindeki farklılıklara ve G/Ç bağlantı noktalarının programlanmasına ilişkin birkaç özel yönergeye tabi olarak herhangi bir C/C++ kursuyla uyumlu olacaktır.

    Temel bilgilerin temelleri

    Birkaç resmi şey, yani herkesin bildiği ama bazen unuttuğu şeyler...

    Arduino IDE'de, C/C++'da olduğu gibi, karakter durumunun farkında olmanız gerekir. if, for gibi anahtar sözcükler her zaman küçük harfle yazılır. Her talimat ";" ile biter. Noktalı virgül, derleyiciye hangi bölümün bir ifade olarak yorumlanacağını söyler.

    Parantezler (..) program bloklarını belirtmek için kullanılır. Bunları bir işlevin gövdesini (aşağıya bakın), döngüleri ve koşullu ifadeleri sınırlamak için kullanırız.

    Program içeriğine yorum eklemek iyi bir uygulamadır, bu kodun anlaşılmasını kolaylaştırır. ile başlayan tek satırlık yorumlar // (çift eğik çizgi). İle başlayan çok satırlı yorumlar /* ve ile bitirmek */

    Herhangi bir kütüphaneyi programımıza dahil etmek istiyorsak include komutunu kullanırız. İşte bağlantı kitaplıklarına örnekler:

    #katmak // standart kitaplık #include "svoya_biblioteka.h" // proje dizinindeki kitaplık

    Arduino'daki Fonksiyonlar

    Bir işlev (alt program), bir programın bazı işlemleri gerçekleştiren ayrı bir parçasıdır. İşlevler, ana programı basitleştirmek ve kod okunabilirliğini artırmak için kullanılır. Fonksiyonları bir çok projemizde rahatlıkla kullanabileceğimiz için kullanmakta fayda var.

    Standart programlama kursu, aşağıdaki makalelerde sunacağımız işlevler hakkında bilgiler içerir. Arduino söz konusu olduğunda, en basit programın bile iki özel işlevi olması gerektiğinden, işlevler başlangıçta tartışılacaktır. Bundan önceki makalelerde zaten bahsedilmişti, ancak burada bu bilgileri sistematik hale getiriyoruz.

    işlev bildirimi

    İşlev bildirim şeması şöyle görünür:

    işlev_adı(parametre) yazın ( // yürütülecek komutlar (işlev gövdesi) return (/* dönüş değeri*/); )

    tip verilen programlama dilinde mevcut herhangi bir veri tipinin adıdır. Arduino programlanırken kullanılabilen türlerin listesi ayrı bir makalede verilecektir.

    Yürütmeden sonra işlev, bildirilen türün değerini döndürür. İşlev herhangi bir dönüş değeri kabul etmezse, veri türü "void" olacaktır.

    fonksiyon adı benzersiz bir şekilde tanımlanmasını sağlar. Bir işlevi çağırmak (çalıştırmak) için ona bir ad veririz.

    parametre— işlev çağrısı parametresi. Parametreler isteğe bağlıdır, ancak genellikle kullanışlıdır. Argümanı olmayan bir fonksiyon yazarsak parantezleri boş bırakırız.

    Köşeli parantezlerin içinde "(...)", yürütmek istediğimiz işlev veya talimatın gerçek gövdesini içerir. Belirli talimatların açıklaması ayrı bir makalede belirtilecektir.

    Bir değer döndüren tüm işlevler, bir dönüş ifadesiyle ve ardından dönüş değeriyle sona erer. Yalnızca bir null işaretçisi ("void") ile bildirilen işlevler bir dönüş ifadesi içermez. Geri dönüş ifadesinin, konumdan bağımsız olarak işlevin yürütülmesini sonlandırdığını bilmeniz gerekir.

    Aşağıda işlev bildirimlerinin bazı örnekleri verilmiştir.

    Void f1() ( //işlev gövdesi) —————————————— int minus() ( //işlev gövdesi dönüş (0); ) ——————————— ——— int artı(int a, int b) ( dönüş (a+b); )

    Örneklerden de görebileceğiniz gibi, bir fonksiyon bildirimi ihtiyaçlarınıza bağlı olarak birçok şekilde olabilir.

    Kendi programlarınızı yazarken fonksiyonları öğrenmenizi ve kullanmanızı şiddetle tavsiye ederiz. Zamanla, her programcının "tüm durumlar için" kendi işlev kitaplığı vardır, bu da yeni programlar yazmayı daha kolay ve daha hızlı hale getirir.

    Artık kendi fonksiyonumuzu nasıl yazacağımızı bildiğimize göre, onu nasıl kullanacağımızı öğrenmemiz gerekiyor.

    İşlev çağrısı

    Tüm fonksiyonları tek bir dosyaya/programa yazıyoruz. Elbette daha zarif bir çözüm var ama bir dahaki sefere onu tarif etmeye çalışacağız.

    Bir işlevi bildirerek, onu diğer işlevlerde uygun adla ve gerekli parametrelerle kullanabiliriz. Yukarıda verdiğimiz fonksiyonların çağrılmasına ilişkin örnekler aşağıdadır:

    F1(); artı(2,2); y=artı(1.5);

    Örneklerde görebileceğiniz gibi, bir işlevi çağırmak, adını ve gerekli parametre sayısını belirterek yapılır. Bir işlevi her zaman bildirimine göre çağırmak önemlidir.

    f1() işlevi parametreler olmadan bildirilirse, çağrılırken hiçbir parametre belirtilemez, örn. f1(0) işlevinin çağrılması yanlış olacaktır.

    plus(int a, int b) işlevi tam olarak iki parametre gerektirir, bu nedenle bir veya üç parametre ile çağırmak mümkün değildir.

    y=plus(1,5) çağrısı, "artı" işlevini "1" ve "5" parametreleriyle çalıştıracak ve dönüş değerini "y" değişkeninde saklayacaktır.

    setup() ve loop() işlevleri.

    Fonksiyonları bildirme ve çağırma hakkında bilgi sahibi olduktan sonra, Arduino sistem fonksiyonlarına geçebiliriz: kurmak() Ve döngü(). Arduino IDE'nin bu iki işlevi bildirmesi gerekir.

    setup(), güç açıldığında veya RESET düğmesine basıldığında otomatik olarak çağrılan bir işlevdir.

    Adından da anlaşılacağı gibi, genellikle başlangıç ​​​​parametrelerinde verilen değişkenlerin başlangıç ​​​​değerlerini, sistemin giriş ve çıkış bildirimlerini ayarlamak için kullanılır. Spesifikliği nedeniyle, bu işlev bir değer döndürmez ve parametrelerle çağrılmaz. setup() işlevinin doğru bildirimi aşağıda verilmiştir:

    Geçersiz kurulum () ( // işlev gövdesi - sistem başlatma)

    loop (), sonsuz bir döngüde çağrılan bir işlevdir. Bu işlev ayrıca bir değer döndürmez ve parametrelerle çağrılmaz. Aşağıdaki loop() işlevinin doğru bildirimidir:

    Boşluk döngüsü () ( // işlev gövdesi - program kodu)

    Gördüğünüz gibi, loop() işlevinin bildirimi, setup() işlevinin bildirimiyle aynıdır. Fark, bu işlevlerin mikrodenetleyici tarafından performansında yatmaktadır.

    Şimdi aşağıdaki sözde kodu analiz edeceğiz:

    geçersiz kurulum () ( on_led1 (); // led1'i aç off_led1 (); // led1'i kapat) geçersiz döngü () ( on_led2 (); // led2'yi aç off_led2 (); // led2'yi kapat)

    setup() fonksiyonunda iki talimat vardır, ilki karta bağlı led1'i açar (örneğin pin 13), ikincisi led1'i kapatır.

    Loop() fonksiyonu, karta bağlı led2'yi (örn. pin 12) açmak ve kapatmak için aynı talimatlara sahiptir.

    Programın çalıştırılması sonucunda led1 bir kez yanıp sönecek, led2 ise Arduino açık olduğu sürece yanıp sönecektir.

    RESET butonuna basılması led1'in tekrar yanıp sönmesine ve led2'nin tekrar yanıp sönmeye başlamasına neden olacaktır.

    Özetle:

    • setup() ve loop() fonksiyonları, her projede tanımlanması gereken sistem fonksiyonlarıdır. Bunlardan birine kod yazmadığımız bir durumda bile yine de bu iki fonksiyonu deklare etmemiz gerekiyor;
    • setup() işlevi bir kez çalışır, loop() sürekli çalışır;
    • Kendi fonksiyonlarımızı tek bir dosyada oluşturuyoruz;
    • Fonksiyonlarımızı hem setup() hem de loop()'tan ve diğer fonksiyonlardan çağırabiliriz;
    • Kendi fonksiyonlarımız parametrelerle çağrılabilir ve bir değer döndürebilir;
    • Bildirimine uygun olarak bir işlev çağrısı yapılmalıdır.

    Bir arduinistin hayatında, er ya da geç, düzenli bir gelişim ortamında kalabalıklaştığı bir an gelir. Eskizlerinizin belleği tükenirse, gerçek zamanlı ve kesintilerle çalışmaya ihtiyacınız varsa veya yalnızca donanıma daha yakın olmak istiyorsanız, o zaman C'ye geçme zamanı gelmiştir. Deneyimli elektronik mühendisleri, Arduino'dan bahsedildiğinde kaşlarını çatar ve bir havya için radyo mağazasına çaylak. Bu en kötü tavsiye olmayabilir, ancak henüz onu uygulamayacağız. Arduino IDE'yi ve kablolama / işleme dilini bir kenara bırakırsak, elimizde mikrodenetleyicinin çalışması için gerekli her şeyle donatılmış mükemmel bir hata ayıklama kartımız olacak. Ve daha da önemlisi, denetleyicinin belleğine zaten bir önyükleyici dikilmiştir, bu da bir programlayıcı kullanmadan bellenimi indirmenize olanak tanır.

    C programlama için AVR GCC Toolchain'e ihtiyacımız var.

    Arduino IDE'nin kurulu olmasına da ihtiyacımız var çünkü. bellenimi denetleyiciye indirmek için gereken avrdude yardımcı programını içerir. CrossPack ayrıca avrdude içerir, ancak onunla gelen sürüm Arduino ile çalışmaz.

    Her şey kurulduktan sonra ilk projemizi oluşturalım. Başlamak için yazalım makefile. Üretici yazılımını her derlediğimizde ve indirdiğimizde uzun komutları manuel olarak girmekten kaçınmamıza izin verecektir.

    #Kart üzerine kurulu kontrolör. Farklı olabilir, örneğin atmega328 CİHAZ = atmega168 #Saat frekansı 16MHz SAAT = 16000000 #Başlat komutu avrdude. Arduino IDE'den kopyalanması gerekir. AVRDUDE=/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf -carduino -P/dev/tty.usbserial-A600dAAQ -b19200 -D -p atmega168 NESNELER = main.o DERLEME = avr-gcc -Duvar -Os -DF_CPU=$(SAAT) -mmcu=$(CİHAZ) hepsi: ana .hex .c.o: $(DERLEME) -c $< -o $@ .S.o: $(COMPILE) -x assembler-with-cpp -c $< -o $@ .c.s: $(COMPILE) -S $< -o $@ flash: all $(AVRDUDE) -U flash:w:main.hex:i clean: rm -f main.hex main.elf $(OBJECTS) main.elf: $(OBJECTS) $(COMPILE) -o main.elf $(OBJECTS) main.hex: main.elf rm -f main.hex avr-objcopy -j .text -j .data -O ihex main.elf main.hex avr-size --format=avr --mcu=$(DEVICE) main.elf

    Bu dosyada avrdude çalıştırmak için komutumuzu girmemiz gerekiyor. Farklı sistemlerde farklı görünecektir. Seçeneğinizi öğrenmek için Arduino IDE'yi başlatın ve ayarlarda "Yükleme sırasında ayrıntılı çıktıyı göster" kutusunu işaretleyin.

    Şimdi herhangi bir taslağı Arduino'ya yüklüyoruz ve pencerenin altında görüntülenen mesajlara bakıyoruz. Orada avrdude çağrısını buluyoruz, -Uflash parametresi dışındaki her şeyi kopyalayıp "AVRDUDE=" sonrasına Makefile'a yapıştırıyoruz.


    Küçük bir not: Makefile'deki tüm girintiler sekme karakterleriyle yapılır (Sekme tuşu). Metin düzenleyiciniz bu karakterleri boşluklarla değiştirirse, make komutu projeyi oluşturmayı reddeder.

    Şimdi bir dosya oluşturalım ana.c- geleneksel olarak LED'i yanıp söndürdüğümüz programımızın gerçek metni.

    #katmak #katmak #define LED_PIN 5 int ana() ( DDRB |= 1<< LED_PIN; while(1) { PORTB |= 1 << LED_PIN; _delay_ms(1000); PORTB &= ~(1 << LED_PIN); _delay_ms(1000); } return 0; }

    Projemiz hazır. Konsolu projemizin dizininde açın ve "make" komutunu girin:


    Gördüğünüz gibi, ortaya çıkan ürün yazılımının boyutu yalnızca 180 bayttır. Benzer bir Arduino taslağı, denetleyicinin belleğinde 1116 bayt yer kaplar.

    Şimdi konsola geri dönün ve derlenen dosyayı denetleyiciye yüklemek için "make flash" yazın:


    İndirme hatasız gittiyse, kartın 13. pinine bağlı LED mutlu bir şekilde yanıp sönecektir. Bazen avrdude kartı bulamaz veya zaman aşımına uğrar - bu durumda USB kablosunu döndürmek yardımcı olabilir. Ayrıca kart erişim çakışmalarını önlemek için "make flash" komutundan önce Arduino IDE'yi kapatmayı unutmayın.

    Belki de bu makalede açıklanan şeylerin çoğu, deneyimli geliştiriciler için açık görünecektir. Yeni başlayan bir arduinist için süreci en anlaşılır dilde anlatmaya ve çeşitli kaynaklardan almayı başardığım ve deneyimle doğruladığım bilgileri tek bir yerde toplamaya çalıştım. Belki bu makale birine birkaç saat zaman kazandırır.

    Mikrodenetleyicilerde uzmanlaşmada iyi şanslar!

    Demek bir işlemcin var. İşlemcinin bir şekilde istediğinizi yapmak üzere programlanabileceğini muhtemelen anlamışsınızdır. Yararlı işlerin yapılabilmesi için (a) yararlı bir program yazmak ve (b) yürütmesi için işlemciye vermek gerekir.

    Genel olarak, ne tür bir işlemciye sahip olduğunuz önemli değildir: dizüstü bilgisayarınızda en son Intel Pentium veya Arduino kartındaki mikrodenetleyici. Program yazma ilkeleri, yani programlama her iki durumda da aynıdır. Tek fark, diğer cihazlarla çalışma fırsatlarının hızı ve kapsamıdır.

    Program nedir ve nereye yazılır?

    İşlemci, üretimin karmaşıklığına rağmen, özünde oldukça basit ve anlaşılır bir şeydir. Nasıl düşüneceğini bilmiyor. Kendisine verilen talimatları ancak körü körüne, bayt bayt uygulayabilir. İşte bir talimat dizisinin kabaca bir örneği:

    Talimat baytıİşlemci için ne anlama geliyor?
    00001001 şu anlama gelir: sonraki baytı al ve 1 numaralı hücrede sakla
    00000110 ... bu sadece 1 numaralı hücrede hatırladığımız bir sonraki bayt: 5 sayısı
    00011001 şu anlama gelir: 1. hücredeki değerden bir çıkarın ve güncellenen sonucu orada bırakın
    00101001 şu anlama gelir: 1 numaralı hücredeki değeri sıfırla karşılaştırın ve sıfırsa - bir sonraki baytta belirtilen sayıda baytın üzerinden atlayın
    00000100 …sonuç sıfırsa, sondan bir önceki talimata 4 bayt atlamak isteriz
    10000011
    01000001 ... "A" harfi tam olarak bu koda karşılık gelir
    00101000 sonraki bayt kadar bayt geri atlamak istediğimiz anlamına gelir
    00000110 ...6 bayt geriye, 3 numaralı talimata atlayacağız
    10000011 sonraki baytta kodu yazılan karakteri görüntülemek istediğimiz anlamına gelir
    00100001 ... imza "!" sadece bu kodla eşleşir

    Bu tür bir talimat dizisinin yürütülmesi sonucunda, ekranda “AAAA!” Panik ibaresi görüntülenecektir.

    Bu kadar basit bir amaç için oldukça fazla kod! Açıktır ki, tüm programlar doğrudan bu şekilde yazılsaydı, karmaşık ürünlerin geliştirilmesinin yüzyıllar alacağı açıktır.

    Programlama dillerine neden ihtiyaç duyulur?

    Görevi milyonlarca kez basitleştirmek için programlama dilleri icat edildi. Birçoğu var ve sürekli olarak duyanlardan bile bir veya iki düzineyi hızlıca hatırlayabilirsiniz: Assembler, C, C ++, C #, Java, Python, Ruby, PHP, Scala, JavaScript.

    Bu dillerdeki programlar insanın doğal diline çok daha yakındır. Ve bu nedenle yazmak daha kolay, daha hızlı ve daha keyifli ve en önemlisi çok daha kolay Okumak: yazdıktan hemen sonra size, bir yıl sonra size veya meslektaşınıza.

    Sorun şu ki, bu tür diller işlemci tarafından anlaşılamıyor ve ona bu programı vermeden önce, derlemek: doğal dilden aynı talimatlara sıfırlar ve birler biçiminde çevirin. Bu, adı verilen programlar tarafından yapılır. derleyiciler. Fantezi düzeyinde kalmadığı sürece her dilin kendi derleyicisi vardır. Popüler diller için, farklı üreticilerden ve farklı platformlar için genellikle aralarından seçim yapabileceğiniz birkaç tane vardır. Çoğu internette ücretsiz olarak mevcuttur.

    Dolayısıyla, bir kişinin oldukça anlayabileceği bir dilde programlar vardır: bunlara "kaynak kodu", kısaca "kod" veya "kaynak kodları" da denir. Kullanılarak düz metin dosyalarına yazılırlar. herhangi metin editörü, not defteri ile bile. Daha sonra derleyicinin yardımıyla işlemcinin anlayabileceği sıfır ve bir kümelerine dönüştürülürler: derleyici kaynak kodunu girdi olarak alır ve oluşturur. ikili çalıştırılabilir, işlemci tarafından anlaşılan.

    İkili dosyalar okunamaz ve genel olarak yalnızca işlemci tarafından yürütülmesi amaçlanır. Ne için alındıklarına bağlı olarak farklı bir türe sahip olabilirler: .exe - bunlar Windows için programlar, .hex - bir Arduino mikrodenetleyicisi tarafından yürütülen programlar, vb.

    Neden bu kadar çok programlama dili var ve aralarındaki fark nedir?

      Neden? Çünkü Dünya'da birçok insan ve şirket var ve birçoğu bunu herkesten daha iyi yapabileceklerine inanıyor: daha rahat, daha net, daha hızlı, daha ince.

      Fark nedir: farklı diller, farklı yazma hızı, okunabilirlik ve yürütme hızı dengesidir.

    Farklı programlama dillerinde ekranda 99 şişe birayla ilgili bir şarkı görüntüleyen aynı programa bakalım.

    Örneğin, Perl dili. Hızlı yazılmış; programcının ne demek istediğini anlamak mümkün değil; yavaş yürütülür:

    alt b( $n = 99 - @_ - $_ || No; "$n şişe" . "s" x!!-- $n . " bira" ) ; $w = "duvarda" ; kalıp haritası ( b. "$w, \N". B. ", \n Birini indir, dağıt,\n ". b(0) . "$w. \n\n"} 0 .. 98

    Java dili. Nispeten uzun yazılmıştır; okuması kolay; oldukça hızlı yürütülür, ancak çok fazla bellek kaplar:

    sınıf şişeleri ( genel statik geçersiz ana ( Sicim bağımsız değişkenler) ( Sicim s = "s" ; for (int bira= 99 ; bira>- 1 ; ) ( sistem.out .print (biralar + duvardaki "şişe" + s + "bira, " ) ; sistem.out .println (biralar + "şişe" + s + "bira," ) ; if (bira== 0 ) ( sistem.out .print( "Dükkana git, biraz daha al") ; sistem.out .println( "Duvarda 99 şişe bira var.\n ") ; sistem.çıkış(0) ; ) başka sistem.out .print( "Birini indir, etrafa dağıt") ; s = (-- biralar == 1 ) ? "" : "S" ; sistem.out .println(biralar + "şişe" + s + " duvardaki bira.\n ") ; } } }

    derleme dili. Uzun zamandır yazılıyor; okuması zor; çok hızlı çalışır:

    kod bölümü cs : code , ds : code org 100h start : ; Ana döngü mov cx , 99 ; loopstart ile başlamak için şişeler: printcx'i çağırın; mov dx sayısını yazdır, ofset satırı1 ; ilk satırın geri kalanını yazdır hareket ah, 9; MS-DOS yazdırma dizesi yordamı int 21h çağrı printcx ; mov dx numarasını yazdır, ofset satırı2_3 ; 2. ve 3. satırların geri kalanı mov ah , 9 int 21h ara cx ; bir aşağı aramayı geri al printcx ; mov dx sayısını yazdır, ofset satırı4 ; dördüncü satırın geri kalanını yazdır hareket ah , 9 int 21h cmp cx , 0 ; Biranız mı bitti? jne döngü başlangıcı; değilse, devam et int 20h ; MS-DOS'tan çıkmak ; CX kaydını ondalık olarak yazdırmak için alt program printcx: mov di , ofset numarası ; arabelleği sondan doldurun hareket baltası, cx ; sayıyı AX'e koy ki bölelim printcxloop: hareket dx , 0 ; yüksek dereceli pay sözcüğü - her zaman 0 mov bx , 10 div bx ; DX:AX'i 10'a bölün. AX=bölüm, DX=kalan dl'yi ekle, "0" ; kalanı bir ASCII karakterine dönüştür hareket [ds : di] , dl ; cmp ax , 0 yazdırma arabelleğine koyun; Hesaplanacak başka rakam var mı? je printcxend; değilse, Aralık sonu ; sonraki basamağı geçerli olandan önce koy jmp printcxdöngüsü; döngü printcxend: mov dx , di ; hesaplanan son basamaktan başlayarak yazdır mov ah, 9 int 21s ret; Veri hattı1 ​​db "duvardaki bira şişeleri", 13 , 10 , "$" line2_3 db " bira şişesi" , 13 , 10 , "Birini indir, etrafa dağıt", 13 , 10 , "$" satır4 db "duvardaki bira şişeleri.", 13 , 10 , 13 , 10 , "$" sayi db 0 , 0 , 0 , 0 , 0 sayibufferend db 0 , "$" kodu biter end start

    Arduino nasıl programlanır?

    Atmel'den Arduino veya mikrodenetleyicilerden bahsetmişken, onlar için programlar hangi dilde yazılabilir? Teorik cevap: herhangi biri. Ancak pratikte seçim Assembler, C ve C++ ile sınırlıdır. Bunun nedeni, bir masaüstü bilgisayara kıyasla çok sınırlı kaynaklara sahip olmalarıdır. Kilobaytlarca bellek, gigabaytlarca değil. İşlemcide megahertz, gigahertz değil. Bu ucuzluk ve enerji verimliliği için bir bedeldir.

    Bu yüzden verimli bir şekilde derleyebilen ve çalıştırabilen bir dile ihtiyacınız var. Yani, değerli talimatları ve boş hafızayı harcamadan, talimatlardan bu sıfırlara ve birlere mümkün olduğunca en iyi şekilde çevirmek. Bu diller de bir o kadar etkilidir. Bunları kullanarak, mikrodenetleyici kaynaklarının dar sınırları içinde bile, hızlı çalışan, zengin özelliklere sahip programlar yazabilirsiniz.

    Assembler, gördüğünüz gibi, en basit ve en zarif dil değildir ve sonuç olarak C/C++, Arduino için amiral gemisi dilidir.

    Birçok kaynak Arduino'nun Arduino dili Processing, Wiring ile programlandığını söylüyor. Bu tamamen doğru bir ifade değil. Arduino, C / C ++ ile programlanmıştır ve bu kelimelerle adlandırılan şey, her seferinde tekerleği yeniden icat etmeden birçok tipik görevi çözmenize izin veren kullanışlı bir "gövde kiti" dir.

    C ve C++ neden aynı cümlede geçiyor? C++, C'ye bir eklentidir. Her C programı geçerli bir C++ programıdır, ancak tersi geçerli değildir. İkisini de kullanabilirsiniz. Çoğu zaman, mevcut sorunu çözerken ne kullandığınızı düşünmezsiniz bile.

    Konuya gelin: ilk program

    İlk Arduino programını yazalım ve board'a çalıştıralım. Kaynak kodu ile bir metin dosyası oluşturmanız, derlemeniz ve ortaya çıkan ikili dosyayı karttaki mikrodenetleyiciye koymanız gerekir.

    Sırayla gidelim. Kaynak kodunu yazalım. Not defterine veya başka bir düzenleyiciye yazabilirsiniz. Ancak işi kolaylaştırmak için sözde geliştirme ortamları (IDE: Integrated Development Environment) vardır. Tek bir araç biçiminde, vurgulama ve ipuçları içeren bir metin düzenleyici, bir düğmeyle başlatılan bir derleyici ve diğer birçok eğlence sağlarlar. Arduino için bu ortama Arduino IDE adı verilir. Resmi web sitesinde ücretsiz olarak indirilebilir.

    Ortamı kurun ve çalıştırın. Görünen pencerede şunu göreceksiniz: alanın çoğu metin düzenleyiciye verilmiştir. Kodun yazıldığı yerdir. Arduino dünyasında kod da denir eskiz.

    Öyleyse hiçbir şey yapmayan bir eskiz yazalım. Yani, sadece zamanı yakan mümkün olan en küçük doğru C++ programı.

    geçersiz kurulum() ( ) geçersiz döngü() ( )

    Henüz yazılı kodun anlamına odaklanmayacağız. Hadi derleyelim. Bunu yapmak için Arduino IDE'de araç çubuğunda bir "Doğrula" düğmesi vardır. Tıklayın ve birkaç saniye içinde ikili dosya hazır olacaktır. Bu, metin düzenleyicinin altındaki "Derleme tamamlandı" yazısı ile duyurulacaktır.

    Sonuç olarak, mikrodenetleyici tarafından çalıştırılabilen .hex uzantılı bir ikili dosyamız var.

    Şimdi onu Arduino'ya kaydırmanız gerekiyor. Bu işleme önyükleme, yanıp sönme veya yanıp sönme denir. Arduino IDE'de bir yükleme gerçekleştirmek için araç çubuğunda bir "Yükle" düğmesi vardır. Arduino'yu bilgisayara USB kablosuyla bağlayın, "Yükle"ye tıklayın ve birkaç dakika içinde program Arduino'ya yüklenecektir. Bu durumda, daha önce orada bulunan program silinecektir.

    Başarılı aygıt yazılımı, "Yükleme Bitti" yazısıyla duyurulacaktır.

    İndirmeye çalışırken bir hatayla karşılaşırsanız şunlardan emin olun:

      Araçlar → Pano menüsünde Arduino'nun fiilen bağlı olduğu port seçilir. Hangi bağlantı noktasının görünüp kaybolduğunu görmek için USB kablosunu takıp çıkarabilirsiniz: bu Arduino'dur.

      Arduino için gerekli sürücüleri yüklediniz. Bu, Windows için gereklidir, Linux için gerekli değildir ve yalnızca MacOS'ta Arduino Duemilanove'den önceki eski kartlar için gereklidir.

    Tebrikler! Temiz bir sayfadan çalışan bir Arduino programına kadar gittiniz. Hiçbir şey yapmasına izin vermeyin, ama bu zaten bir başarı.

    Mikrodenetleyicileri öğrenmek karmaşık ve anlaşılmaz bir şey gibi mi görünüyor? Arudino'nun gelişinden önce, bu gerçekten kolay değildi ve belirli bir dizi programcı ve diğer ekipman gerektiriyordu.

    Bu bir tür elektronik tasarımcı. Projenin ilk hedefi, insanların elektronik parçalara minimum zaman ayırarak elektronik cihazların nasıl programlanacağını kolayca öğrenmelerini sağlamaktır.

    En karmaşık devrelerin montajı ve panoların bağlantısı, bir havya olmadan, ancak ayrılabilir erkek ve dişi bağlantıları olan jumper'ların yardımıyla gerçekleştirilebilir. Bu şekilde, arduinoschikov sözlüğünde basitçe "Kalkanlar" (kalkan) olarak adlandırılan hem ekler hem de genişletme kartları bağlanabilir.

    Yeni başlayanlar için satın alınan ilk Arduino kartı nedir?

    Temel ve en popüler yönetim kurulu olarak kabul edilir. Bu ücret yaklaşık bir kredi kartı büyüklüğündedir. Oldukça büyük. Satışta olan çoğu kalkan, onunla mükemmel uyum sağlar. Kart üzerinde harici cihazların bağlanması için soketler bulunmaktadır.

    2017 için yurt içi mağazalarda fiyatı 4-5 dolar civarında. Modern modellerde kalbi Atmega328'dir.

    Arduino kartının görüntüsü ve her pinin işlevinin kodunun çözülmesi, Arduino UNO pin çıkışı

    Bu karttaki mikrodenetleyici, DIP28 paketindeki uzun bir yongadır, yani 28 pime sahiptir.

    Bir sonraki en popüler tahta, öncekinden neredeyse iki kat daha ucuza mal oluyor - 2-3 dolar. Bu bir ücret. Mevcut kartlar aynı Atmega328 üzerine inşa edilmiştir, işlevsel olarak UNO'ya benzerler, farklar boyut ve USB eşleştirme çözümüdür, daha sonra buna değineceğiz. Diğer bir fark ise, cihazları karta bağlamak için iğne şeklindeki fişlerin sağlanmasıdır.

    Bu kartın pin (bacak) sayısı aynıdır, ancak mikrodenetleyicinin daha kompakt bir TQFP32 paketinde yapıldığını, ADC6 ve ADC7'nin pakete eklendiğini, diğer iki "ekstra" bacağın güç veriyolunu kopyaladığını görebilirsiniz. . Boyutları oldukça kompakttır - yaklaşık olarak başparmağınızın boyutu kadardır.

    Üçüncü en popüler anakart ise bilgisayara bağlanmak için USB portu yok, bağlantının nasıl yapıldığını biraz sonra anlatacağım.

    Bu, incelenenlerin en küçüğüdür, aksi takdirde önceki ikisine benzer ve kalbi hala Atmega328'dir. Bu yeni başlayanlar için bir makale olduğundan ve panoların karşılaştırılması ayrı bir makalenin konusu olduğundan, diğer panoları dikkate almayacağız.

    Üst kısımda USB-UART bağlantı şeması, “GRN” pini mikrodenetleyicinin reset devresine kablolanmıştır, farklı bir şekilde çağrılabilir, buna neden ihtiyaç duyulduğunu daha sonra öğreneceksiniz.

    UNO, breadboarding için kullanışlıysa, Nano ve Pro Mini projenizin son sürümleri için iyidir çünkü çok az yer kaplarlar.

    Arduino bilgisayara nasıl bağlanır?

    Arduino Uno ve Nano bilgisayara USB üzerinden bağlıdır. Aynı zamanda USB portu için donanım desteği yoktur, burada genellikle USB-to-Serial veya USB-UART (rs-232) olarak adlandırılan bir seviye dönüştürme devresi çözümü kullanılır. Aynı zamanda, mikrodenetleyiciye, bu veri yollarından geçiş yapmanızı sağlayan özel bir Arduino önyükleyici flaşlanır.

    Arduino Uno, bu bağlantıyı USB destekli bir mikrodenetleyicide uygular - ATmega16U2 (AT16U2). Ana mikrodenetleyiciyi flaşlamak için kart üzerinde ek bir mikrodenetleyiciye ihtiyaç duyulduğu ortaya çıktı.

    Arduino Nano'da bu, FT232R yongası veya onun CH340 muadili tarafından uygulanır. Bu bir mikrodenetleyici değil - bir seviye dönüştürücü, bu gerçek kendi ellerinizle sıfırdan bir Arduino Nano oluşturmayı kolaylaştırıyor.

    Arduino kartını bağladığınızda genellikle sürücüler otomatik olarak yüklenir. Ancak Arduino Nano'nun Çince bir kopyasını satın aldığımda cihaz tanındı ama çalışmadı, dönüştürücünün üzerine çıkış tarihini içeren yuvarlak bir etiket yapıştırıldı, bunun bilerek mi yapıldığını bilmiyorum ama onu soyduğumda CH340 işaretini gördüm.

    Ondan önce bununla karşılaşmadım ve tüm USB-UART dönüştürücülerin FT232'de toplandığını düşündüm, sürücüleri indirmem gerekiyordu, "Arduino ch340 sürücüleri" isteği üzerine bunları bulmak çok kolay. Basit bir kurulumdan sonra - her şey çalıştı!

    Mikrodenetleyici aynı USB bağlantı noktasından da güç alabilir, yani. cep telefonu adaptörüne bağlarsanız sisteminiz çalışacaktır.

    Anakartımda USB yoksa ne yapmalıyım?

    Arduino Pro Mini kartı daha küçüktür. Bu, üretici yazılımı için USB konektörünü ve aynı USB-UART dönüştürücüyü çıkararak sağlandı. Bu nedenle, ayrıca satın alınması gerekir. CH340 (en ucuz), CPL2102 ve FT232R'deki en basit dönüştürücü 1 dolara satılıyor.

    Satın alırken, bu adaptörün hangi voltaj için tasarlandığına dikkat edin. Pro mini'nin 3.3 ve 5 V versiyonları vardır, genellikle dönüştürücülerde besleme voltajını değiştirmek için bir jumper bulunur.

    Pro Mini'yi yanıp sönerken, başlatmadan hemen önce RESET'e basmanız gerekir, ancak DTR'li dönüştürücülerde bu gerekli değildir, bağlantı şeması aşağıdaki şekildedir.

    "Anne-Anne" (kadın-kadın) özel terminalleri ile birleştirilirler.

    Aslında tüm bağlantılar bu tür terminaller (Dupont) kullanılarak yapılabilir, her iki tarafta soketli ve fişlidir ve bir tarafta soket, diğer tarafta fiş vardır.

    Arduino için program nasıl yazılır?

    Eskizlerle çalışmak için (arduino dilinde ürün yazılımının adı), Arduino IDE'nin geliştirilmesi için özel bir entegre ortam vardır, bunu resmi web sitesinden veya herhangi bir tematik kaynaktan ücretsiz olarak indirebilirsiniz, genellikle kurulumda sorun yok.

    Program arayüzü böyle görünüyor. Arduino için özel olarak geliştirilmiş basitleştirilmiş bir C AVR dilinde programlar yazabilirsiniz, aslında bu, saf C AVR'de olduğu gibi, Kablolama adı verilen bir dizi kitaplıktır. Kullanımı kodu kolaylaştırır ve çalışmasını hızlandırır.

    Pencerenin üst kısmında, bir dosyayı açabileceğiniz, ayarları açabileceğiniz, birlikte çalıştığınız panoyu seçebileceğiniz (Uno, Nano ve diğerleri) ve ayrıca hazır kod örnekleriyle projeleri açabileceğiniz tanıdık bir menü vardır. Aşağıda, bellenim ile çalışmak için bir dizi düğme bulunmaktadır, aşağıdaki şekilde tuşların atanmasını göreceksiniz.

    Pencerenin alt kısmında proje, kodun durumu, ürün yazılımı ve hataların varlığı hakkında bilgi görüntülemek için bir alan vardır.

    Arduino IDE'de programlamanın temelleri

    Kodun başında, değişkenleri bildirmeniz ve varsa ek kitaplıkları bağlamanız gerekir, bu aşağıdaki gibi yapılır:

    #include biblioteka.h; // "Biblioteka.h" isimli kütüphaneyi ekleyin

    #define değişken 1234; // 1234 değeri ile bir değişken bildirin

    Tanımla komutu, derleyicinin değişkenin türünü seçmesine izin verir, ancak bunu manuel olarak, örneğin bir tamsayı int veya bir kayan noktalı kayan nokta olarak ayarlayabilirsiniz.

    int led = 13; // bir "led" değişkeni yarattı ve ona "13" değerini atadı

    Program pinin durumunu 1 veya 0 olarak tanımlayabilir. 1 mantıksal bir birimdir, eğer pin 13 1 ise fiziksel bacağındaki voltaj mikrodenetleyici besleme voltajına eşit olacaktır (arduino UNO ve Nano için - 5 V )

    Bir dijital sinyal digitalWrite(pin, value) komutu kullanılarak yazılır, örneğin:

    digitalWrite(led, yüksek); //pin 13 (yukarıda belirtmiştik) günlüğündeki birimi kaydedin. Birimler.

    Anlayabileceğiniz gibi, bağlantı noktalarına yapılan itiraz, tahtadaki numaralandırmaya, karşılık gelen numaraya göre gider. İşte önceki koda benzer bir örnek:

    digitalWrite(13, yüksek); // pin 13'ü bire ayarla

    Delay() komutu ile sıklıkla talep edilen bir zaman geciktirme fonksiyonu çağrılır, değeri milisaniye cinsinden verilir, mikrosaniye ile ulaşılır.

    delayMicroseconds() Gecikme(1000); //mikrodenetleyici 1000ms (1 saniye) bekleyecek

    Giriş ve çıkış için bağlantı noktası ayarları, aşağıdaki komutla, void setup() işlevinde ayarlanır:

    pinMode(NOMERPORTA, ÇIKIŞ/GİRİŞ); // bağımsız değişkenler - değişken adı veya bağlantı noktası numarası, aralarından seçim yapabileceğiniz giriş veya çıkış

    İlk Blink programını anlama

    Mikrodenetleyiciler için bir tür "Merhaba dünya" olarak, bir LED'i yanıp sönmek için bir program var, koduna bakalım:

    Başlangıçta pinMode komutu ile mikrodenetleyiciye LED'li portu çıkışa atamasını söyledik. Kodun "LED_BUILTIN" değişkenini bildirmediğini zaten fark ettiniz, gerçek şu ki Uno, Nano ve diğer fabrika kartlarında yerleşik bir LED pin 13'e bağlı ve kart üzerine lehimlenmiştir. Sizin tarafınızdan projelerinizde gösterge olarak veya flaşör programlarınızın basit bir şekilde test edilmesi için kullanılabilir.

    Ardından, LED'in lehimlendiği pimi bir (5 V) olarak ayarlıyoruz, sonraki satır MK'yi 1 saniye bekletiyor ve ardından LED_BUILTIN pimini sıfıra ayarlıyor, bir saniye bekliyor ve program bir daire içinde tekrar ediyor, yani LED_BUILTIN 1 olduğunda - LED (ve bağlantı noktasına bağlı diğer yükler) etkinleştirilir, 0 olarak ayarlandığında devre dışı bırakılır.

    Analog porttan değeri okuyun ve okunan verileri kullanın

    AVR Atmega328 mikrodenetleyici, yerleşik bir 10 bit analogdan dijitale dönüştürücüye sahiptir. 10 bit ADC, tüm sinyal genliğinin (5 V) 1/1024'lük adımlarıyla 0 ila 5 volt arasındaki voltaj değerini okumanızı sağlar.

    Daha açık hale getirmek için durumu göz önünde bulundurun, analog girişteki voltaj değeri 2,5 V diyelim, yani voltaj 0 - "0" ise mikrodenetleyici "512" piminden değeri okuyacak ve 5 V ise - (1023). 1023 - çünkü sayım 0'dan başlar, yani 0, 1, 2, 3, vb. toplamda 1023 - 1024 değere kadar.

    Örnek olarak standart "analogInput" taslağını kullanarak kodda nasıl göründüğünü burada bulabilirsiniz.

    int sensörPin = A0;

    int ledPin = 13;

    int sensörDeğeri = 0;

    pinMode(ledPin, ÇIKIŞ);

    sensorValue = analogRead(sensorPin);

    digitalWrite(ledPin, YÜKSEK);

    gecikme(sensörDeğeri);

    digitalWrite(ledPin, DÜŞÜK);

    gecikme(sensörDeğeri);

    Değişkenleri bildiriyoruz:

      Ledpin - çıkışa bağımsız olarak dahili LED'li bir pim atayın ve ayrı bir ad verin;

      sensorPin - analog giriş, kart üzerindeki işarete göre ayarlanır: A0, A1, A2, vb.;

      sensorValue - okunan tamsayı değerini depolamak ve onunla daha fazla çalışmak için bir değişken.

    Kod şu şekilde çalışır: sensorValue, sensorPin'den okunan analog değeri kaydeder (analogRead komutu). - burada analog sinyalle çalışma biter, o zaman her şey önceki örnekteki gibidir.

    ledPin'e bir birim yazıyoruz, LED yanıyor ve sensorValue'nin değerine eşit bir süre yani yani. 0 ila 1023 milisaniye. LED'i kapatıyoruz ve bu süre boyunca tekrar bekliyoruz, ardından kod tekrar ediyor.

    Böylece potansiyometrenin konumuna göre LED'in yanıp sönme frekansını ayarlıyoruz.

    Arudino için harita işlevi

    Aktüatörler için tüm işlevler (hiçbirini bilmiyorum) argüman olarak "1023"ü desteklemez, örneğin, servo dönme açısıyla sınırlıdır, yani servo motorun yarım dönüşü (180 derece) (yarım dönüşü) için , işlevin maksimum argümanı "180"

    Şimdi sözdizimi hakkında: harita (çevirdiğimiz değer, girdinin minimum değeri, girdinin maksimum değeri, minimum çıktı, maksimum çıktı değeri).

    Kodda şöyle görünür:

    (map(analogRead(pot), 0, 1023, 0, 180));

    Potansiyometreden (analogRead (pot)) değeri 0'dan 1023'e kadar okuyoruz ve çıkışta 0'dan 180'e kadar sayılar alıyoruz

    Büyüklük haritasının değerleri:

    Uygulamada bunu aynı servonun koduna uyguluyoruz, Arduino IDE'deki koda bir bakın, önceki bölümleri dikkatlice okursanız açıklama gerektirmez.

    Ve bir bağlantı şeması.

    Arduino, mikrodenetleyicilerle nasıl çalışılacağını öğrenmek için çok kullanışlı bir araçtır. Ve saf C AVR kullanırsanız veya bazen "Saf C" olarak adlandırılırsa - kodun ağırlığını önemli ölçüde azaltacaksınız ve mikrodenetleyicinin belleğine daha fazla sığacak, sonuç olarak mükemmel bir fabrika yapımı elde edeceksiniz. USB üzerinden yanıp sönme özelliğine sahip hata ayıklama kartı.

    arduino'yu severim. Birçok deneyimli mikrodenetleyici programcısının onu çok basitleştirdiği için sebepsiz yere azarlaması üzücü. Prensip olarak, yalnızca dil basitleştirilmiştir, ancak kimse sizi onu kullanmaya zorlamaz, ayrıca mikrodenetleyiciyi ICSP konektörü aracılığıyla flash edebilir ve gereksiz önyükleyici olmadan istediğiniz kodu oraya yükleyebilirsiniz.

    Elektronik ile oynamak isteyenler için ileri düzey bir tasarımcı olarak mükemmel olacak ve deneyimli programcılar için montaj gerektirmeyen bir kart olarak da kullanışlı olacak!

    Arduino ve çeşitli devrelerde kullanımının özellikleri hakkında daha fazla bilgi için e-kitaba bakın - .

    giriiş

    Freeduino/Arduino özel bir programlama dilinde programlanmıştır - C/C++ tabanlıdır ve fonksiyonlarından herhangi birini kullanmanıza izin verir. Açıkçası, Arduino derleyicisi olmadığı gibi ayrı bir Arduino dili de yoktur - yazılı programlar (minimum değişikliklerle) bir C / C ++ programına dönüştürülür ve ardından AVR-GCC derleyicisi tarafından derlenir. Yani aslında AVR mikrodenetleyicileri için özelleşmiş bir C/C++ varyantı kullanılıyor.

    Aradaki fark, basit bir geliştirme ortamına ve mikrodenetleyici "yerleşik" çevre birimlerine erişimi kolaylaştıran bir dizi temel kitaplığa sahip olmanızdır.

    Katılıyorum, seri bağlantı noktasıyla saniyede 9600 bit hızında çalışmaya başlamak ve tek hatta arama yapmak çok uygundur:

    Serial.begin(9600);

    Ve "çıplak" C / C ++ kullanırken, mikrodenetleyicinin belgeleriyle uğraşmanız ve şöyle bir şey çağırmanız gerekir:

    UBRR0H = ((F_CPU / 16 + 9600 / 2) / 9600 - 1) >> 8;
    UBRR0L = ((F_CPU / 16 + 9600 / 2) / 9600 - 1);
    sbi(UCSR0B, RXEN0);
    sbi(UCSR0B, TXEN0);
    sbi(UCSR0B, RXCIE0);

    İşte Arduino programlamanın ana işlevlerine ve özelliklerine kısa bir genel bakış. C/C++ dillerinin sözdizimine aşina değilseniz, bu konudaki herhangi bir literatüre veya İnternet kaynaklarına başvurmanızı tavsiye ederiz.

    Öte yandan, sunulan tüm örnekler çok basit ve büyük olasılıkla kaynak metinleri anlamakta ve ek literatür okumadan bile kendi programlarınızı yazmakta zorluk çekmeyeceksiniz.

    Daha eksiksiz belgeler (İngilizce) projenin resmi web sitesinde mevcuttur - http://www.arduino.cc. Ayrıca bir forum, ek kitaplıklara bağlantılar ve açıklamaları da vardır.

    Arduino projesinin resmi web sitesindeki açıklamaya benzer şekilde, "bağlantı noktası" mikrodenetleyicinin kontağını ifade eder, konektöre karşılık gelen numaranın altında çıkış verir. Ayrıca bir seri veri portu (COM portu) vardır.

    Program Yapısı

    Programınızda iki ana işlevi bildirmelisiniz: setup() ve loop().

    Setup() işlevi, Freeduino kartının her açılışından veya sıfırlanmasından sonra bir kez çağrılır. Değişkenleri başlatmak, dijital bağlantı noktası modlarını ayarlamak vb. için kullanın.

    loop() işlevi, gövdesinde açıklanan komutları sırayla tekrar tekrar yürütür. Onlar. fonksiyon sona erdikten sonra tekrar çağrılacaktır.

    Basit bir örnek verelim:

    geçersiz kurulum() // başlangıç ​​ayarları
    {
    dizi başla(9600); // seri port hızını 9600 bps olarak ayarla
    pinMode(3, GİRİŞ); // veri girişi için 3. portun ayarlanması
    }

    // Program 3. portta sinyal olup olmadığını kontrol eder ve şuna bir yanıt gönderir:
    // bilgisayarın seri portuna metin mesajı olarak
    geçersiz döngü() // program gövdesi
    {
    if (digitalRead(3) == HIGH) // yoklama bağlantı noktası 3 için koşul
    serialWrite("H"); // COM portuna "H" harfi şeklinde bir mesaj gönder
    başka
    serialWrite("L"); // COM portuna "L" harfi şeklinde bir mesaj gönder
    gecikme(1000); // 1 sn gecikme
    }

    pinMode(bağlantı noktası, mod);

    Tanım:

    Bir sinyal girişi veya çıkışı için belirtilen bağlantı noktasını yapılandırır.

    Seçenekler:

    port – modunu ayarlamak istediğiniz portun numarası (0 ile 13 arasında tamsayı değeri).

    mod - GİRİŞ (giriş) veya ÇIKIŞ (çıkış).

    pinMode(13, ÇIKIŞ); //13. pin çıkış olacak
    pinMode(12, GİRİŞ); //ve 12. giriştir

    Not:

    Analog girişler, 14 (analog giriş 0) ile 19 (analog giriş 5) arasındaki numaralarla erişildiğinde dijital giriş/çıkış olarak kullanılabilir.

    digitalWrite(bağlantı noktası, değer);

    Tanım:

    Belirtilen bağlantı noktasında voltaj seviyesini yüksek (YÜKSEK) veya düşük (DÜŞÜK) olarak ayarlar.

    Seçenekler:

    bağlantı noktası: bağlantı noktası numarası

    değer: YÜKSEK veya DÜŞÜK

    digitalWrite(13, YÜKSEK); // pin 13'ü "yüksek" duruma getirin

    değer = digitalRead(bağlantı noktası);

    Tanım:

    Belirtilen bağlantı noktasında bir değer okur

    Seçenekler:

    bağlantı noktası: sorgulanan bağlantı noktası numarası

    Dönüş değeri: int tipi bağlantı noktasındaki (YÜKSEK veya DÜŞÜK) geçerli değeri döndürür

    int değeri;
    val = digitalRead(12); // 12. çıktıyı yokla

    Not:

    Okuma bağlantı noktasına hiçbir şey bağlı değilse, digitalRead() işlevi rastgele YÜKSEK veya DÜŞÜK döndürebilir.

    Analog giriş/çıkış sinyali

    değer = analogRead(bağlantı noktası);

    Tanım:

    Belirtilen analog bağlantı noktasından bir değer okur. Freeduino, her biri 10 bit A/D dönüştürücü olmak üzere 6 kanal içerir. Bu, 0 ila 5V arasındaki bir giriş voltajının 0 ila 1023 arasında bir tamsayı değerine dönüştürüldüğü anlamına gelir. Okuma çözünürlüğü: 5V/1024 değerleri = 0,004883V/değeri (4,883mV). Analog giriş değerini okumak yaklaşık 100 nS (0,0001 S) sürer, dolayısıyla maksimum okuma hızı saniyede yaklaşık 10.000 defadır.

    Seçenekler:

    Dönüş Değeri: Belirtilen bağlantı noktasından okunan 0 ila 1023 aralığında bir int döndürür.

    int değeri;
    val = analogRead(0); // analog giriş 0'daki değeri oku

    Not:

    Analog bağlantı noktaları, varsayılan olarak tanımlanmış sinyal girişidir ve dijital bağlantı noktalarından farklı olarak pinMode işlevi çağrılarak yapılandırılmaları gerekmez.

    analogWrite(bağlantı noktası, değer);

    Tanım:

    Bağlantı noktasına bir analog değer verir. Bu özellik şunlarda çalışır: 3, 5, 6, 9, 10 ve 11 Freeduino dijital bağlantı noktası.

    LED'in parlaklığını değiştirmek, motoru kontrol etmek vb. için kullanılabilir. analogWrite işlevini çağırdıktan sonra, karşılık gelen bağlantı noktası, analogWrite işlevine (veya aynı bağlantı noktasındaki digitalRead / digitalWrite işlevlerine) bir sonraki çağrı gerçekleşene kadar darbe genişliği modülasyonlu voltaj modunda çalışacaktır.

    Seçenekler:

    bağlantı noktası: yoklamalı analog girişin numarası

    değer: 0 ile 255 arasında tamsayı. 0 değeri, belirtilen bağlantı noktasında 0 V üretir; 255 değeri belirtilen bağlantı noktasında +5 V üretir. 0 ile 255 arasındaki değerler için, bağlantı noktası hızla 0 ile +5V arasında geçiş yapar - değer ne kadar yüksek olursa, bağlantı noktası o kadar sık ​​YÜKSEK (5V) üretir.

    analogWrite(9, 128);//pin 9'u 2,5V'a eşdeğer bir değere ayarlayın

    Not:

    AnalogWrite işlevini çağırmadan önce bağlantı noktasını pin olarak ayarlamak için pinMode işlevini çağırmak gerekli değildir.

    Sinyal oluşturma frekansı yaklaşık 490 Hz'dir.

    zaman = milis();

    Tanım:

    Freeduino'nun mevcut programı yürütmesinden bu yana geçen milisaniye sayısını döndürür. Sayaç taşacak ve yaklaşık 9 saat sonra sıfırlanacaktır.

    Dönüş değeri: unsigned long türünde bir değer döndürür

    uzun süre imzasız; // unsigned long tipindeki zaman değişkenini bildiriyoruz
    zaman = milis(); // milisaniye sayısını geçmek

    gecikme(zaman_ms);

    Tanım:

    Programı belirtilen milisaniye sayısı kadar duraklatır.

    Seçenekler:

    time_ms - milisaniye cinsinden program gecikme süresi

    gecikme(1000); //1 saniye duraklat

    gecikmeMikrosaniye

    gecikmeMikrosaniye(zaman_µs);

    Tanım:

    Programı belirtilen mikrosaniye sayısı kadar duraklatır.

    Seçenekler:

    time_µs – mikrosaniye cinsinden program gecikme süresi

    gecikmeMikrosaniye(500); //500 mikrosaniye duraklat

    pulseIn(bağlantı noktası, değer);

    Tanım:

    Dijital bir bağlantı noktasından bir darbeyi (yüksek veya düşük) okur ve darbenin süresini mikrosaniye cinsinden döndürür.

    Örneğin, işlev çağrılırken "değer" parametresi YÜKSEK olarak ayarlanmışsa, pulseIn() bağlantı noktasının yüksek bir sinyal düzeyi almasını bekler. Geldiği andan itibaren, liman düşük bir sinyal seviyesi alana kadar geri sayım başlar. İşlev, darbe uzunluğunu (yüksek seviye) mikrosaniye cinsinden döndürür. 10 mikrosaniyeden 3 dakikaya kadar darbelerle çalışır. Bir darbe algılanana kadar bu işlevin bir sonuç döndürmeyeceğini unutmayın.

    Seçenekler:

    port: Nabzı okuduğumuz port numarası

    değer: darbe tipi YÜKSEK veya DÜŞÜK

    Dönüş değeri: darbenin süresini mikrosaniye cinsinden verir (int yazın)

    int süresi; // int türündeki süre değişkeninin bildirimi
    süre = pulseIn(pim, YÜKSEK); // nabız süresini ölç

    Seri iletişim

    Freeduino, Freeduino/Arduino cihazları arasında veya bir bilgisayarla iletişim kurmak için kullanılabilen yerleşik bir seri denetleyiciye sahiptir. Bir bilgisayarda, karşılık gelen bağlantı bir USB COM bağlantı noktasıyla temsil edilir.

    İletişim, 0 ve 1 numaralı dijital bağlantı noktalarında gerçekleşir ve bu nedenle, seri veri işlevlerini kullanıyorsanız bunları dijital G/Ç için kullanamazsınız.

    Serial.begin(baud hızı);

    Tanım:

    Seri iletişim için COM bağlantı noktasının baud hızını bit/saniye cinsinden ayarlar. Bir bilgisayarla iletişim kurmak için şu standart hızlardan birini kullanın: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 veya 115200. Ayrıca başka bir mikrodenetleyiciyle iletişim kurarken 0 bağlantı noktalarından başka hızlar da tanımlayabilirsiniz. ve 1.

    Seçenekler:

    baudrate: bit/saniye cinsinden veri hızı.

    Serial.begin(9600); //hızı 9600 bps yap

    seri.mevcut

    say = seri.kullanılabilir();

    Tanım:

    Seri bağlantı noktası yoluyla alınan baytlar, programınızın bunları okuyabileceği mikrodenetleyicinin arabelleğine girer. İşlev, arabellekte biriken bayt sayısını döndürür. Seri arabellek 128 bayta kadar depolayabilir.

    Geri dönüş değeri:

    Bir int değeri, seri arabellekte okunabilecek bayt sayısını veya hiçbir şey yoksa 0 döndürür.

    if (Serial.available() > 0) ( // tamponda veri varsa
    // burada veri alınıyor ve işleniyor olmalı
    }

    char = Serial.read();

    Tanım:

    Seri arabellekten bir sonraki baytı okur.

    Geri dönüş değeri:

    Seri bağlantı noktasından gelen verilerin ilk kullanılabilir baytı veya gelen veri yoksa -1.

    incomingByte = Serial.read(); // baytı oku

    Tanım:

    Seri bağlantı noktasının giriş arabelleğini temizler. Arabelleğe alınmış veriler kaybolur ve Serial.read() veya Serial.available()'a yapılan diğer çağrılar, Serial.flush() çağrısından sonra alınan veriler için mantıklı olacaktır.

    Serial.flush(); // Arabelleği temizle - "sıfırdan" veri almaya başla

    Tanım:

    Seri bağlantı noktasına veri çıkışı.

    Seçenekler:

    İşlev, çıktı verilerinin türüne ve biçimine bağlı olarak birkaç çağrı formuna sahiptir.

    Serial.print(b, DEC), b'nin ondalık gösterimi olan bir ASCII dizesi yazdırır.

    int b = 79;

    Serial.print(b, HEX), b sayısının onaltılık gösterimi olan bir ASCII dizesi yazdırır.

    int b = 79;

    Serial.print(b, OCT), b sayısının sekizlik gösterimi olan bir ASCII dizesi yazdırır.

    int b = 79;
    seri baskı(b, ekim); // "117" dizesini bağlantı noktasına gönderecek

    Serial.print(b, BIN), b sayısının ikili temsili olan bir ASCII dizesi yazdırır.

    int b = 79;
    Serial.print(b, BIN); // "1001111" dizesini bağlantı noktasına gönderecek

    Serial.print(b, BYTE), b'nin düşük baytını yazdırır.

    int b = 79;
    Serial.print(b, BAYT); // 79 sayısını yazdırır (bir bayt). monitörde
    //seri port "O" karakterini alıyoruz - onun
    //kod 79

    Serial.print(str) str bir dize veya bir karakter dizisiyse, str'yi COM bağlantı noktasına bayt bayt gönderir.

    karakter baytı = (79, 80, 81); // 79,80,81 değerlerine sahip 3 baytlık dizi
    Serial.print("İşte baytlarımız:"); // "İşte baytlarımız:" dizesini yazdırır
    Seri yazdırma (bayt); // 79,80,81 kodlu 3 karakter verir -
    //bunlar "OPQ" karakterleridir

    Serial.print(b) b, byte veya char türündeyse, b numarasının kendisini bağlantı noktasına yazdırır.

    karakter = 79;
    Seri baskı(b); //bağlantı noktasına "O" karakteri verecek

    Serial.print(b) b bir tamsayı ise, b'nin ondalık gösterimini bağlantı noktasına yazdırır.

    int b = 79;
    Seri baskı(b); // "79" dizesini bağlantı noktasına gönderecek

    Tanım:

    Serial.println işlevi, Serial.print işlevine benzer ve aynı çağrı seçeneklerine sahiptir. Tek fark, verilerden sonra iki ek karakterin çıkarılmasıdır - bir satır başı (ASCII 13 veya "\r") ve bir yeni satır karakteri (ASCII 10 veya "\n").

    Örnek 1 ve Örnek 2, bağlantı noktasına aynı şeyi verecektir:

    int b = 79;
    Serial.print(b, DEC); // "79" dizesini bağlantı noktasına gönderecek
    Serial.print("\r\n"); //"\r\n" karakterlerini gösterecek - yeni satır
    Serial.print(b, HEX); // "4F" dizesini bağlantı noktasına gönderecek
    Serial.print("\r\n");//"\r\n" karakterlerini yazdıracak - yeni satır

    int b = 79;
    Serial.println(b, DEC); // "79\r\n" dizesini bağlantı noktasına gönderecek
    Serial.println(b, HEX); // "4F\r\n" dizesini bağlantı noktasına gönderecek

    Seri port monitöründe alıyoruz.