Arduino kontrol makinesi. Arduino'daki makine: kendi elinizle bir radyo kontrolü nasıl yapılır

Arduino kontrol makinesi.  Arduino'daki makine: kendi elinizle bir radyo kontrolü nasıl yapılır
Arduino kontrol makinesi. Arduino'daki makine: kendi elinizle bir radyo kontrolü nasıl yapılır

Çinlilerden kötü oyuncaklar almayalım, onlardan ucuz bir şasi üreticisi, birkaç modül alıp elimizi uzatalım!

İşte sonunda elde ettiğim şey: fena şasi, kontrollü - TA-EVET !!! - Android akıllı telefonumdan.


"Ben düzüm, ben yanayım,
Bir dönüşle ve bir sıçramayla,
Ve bir koşudan ve yerinde,
Ve iki ayak birlikte ... "

Bugün Bluetooth üzerinden uzaktan kumandalı eğlenceli bir araba kuracağız. Android için kontrol programının kaynakları dahildir.

İyi bir oyuncak örneği

İki çocuğum var, bir kızım ve bir oğlum. Her ikisine de doğum günleri için oyuncaklar verilir. Kızımın verdiği şey, kural olarak, olumsuz tepkilerime neden olmaz. Ve oğluna beklendiği gibi her türlü araba, tank ve diğer ekipman verilir. Çinlilerin tüm bu uçurumlarından sadece kendimin sunduğu oyuncak elektrikli testere herhangi bir şikayete neden olmuyor.

Nedenmiş? Muhtemelen bu testere STIHL alet mağazasında satıldığındandır. STIHL'in küçük bir reklam çalışmasında ürünlerinin bir oyuncak analogunu yaptığına inanıyorum. Sonuç olarak, ağabeyine çok benzeyen, tamamen aklı başında bir oyuncak doğdu. Lastik zincir dönüyor, kontrollerin yüzde 80'i uygulanıyor. Testereyi sarmak için saplı bir kordon, bir anahtar, bir gaz düğmesi bile var. Yedek zincir ve zincir değiştirme aparatı ile birlikte gelir.


İşte bir oyuncak testere

Ne hakkında konuşuyorum? Ah evet, mimarlık! Bu, dilerseniz mükemmel bir oyuncak yapabileceğiniz anlamına gelir. Ve dört gözle bekleyecek bir şey var.

Uzaktan kumandalı makine yapacağız!

Radyo kontrollü oyuncaklar, pratik ve teknik açıdan ilgi çekicidir. Ancak 4-6 yaş arası bir çocuğa "yetişkin" orantı kontrollü oyuncaklar verilmeyecektir. Büyük ihtimalle oyuncak kırılacak ve para çöpe atılacak.
Sonuç olarak, genellikle ucuz bir şey verirler. Tüm bunlardan - "ucuz" - arabalar ya çok hızlıdır ya da frenlidir; tanklar zayıf; ve diğer açık ve gizli eksiklikler. Ve kesinlikle orantılı kontrol yok.

Güzel bir gün, arabalardan biri sağ tekerleği döndürmeyi bıraktı. Demonte edildi, motor kontrol edildi - servis verilebilir.
Kontrol panosunda üç mikro devre var - Çin golem, aklı başında belgeler bulamadım. Bir çip, mantık çıkışları ve iki köprü motor sürücüsü olan bir radyo sinyali alıcısıdır. Sürücülerden biri başarısız oldu. Hemen ayrı bileşenlerden bir köprü motoru sürücüsü istiflemeyi başaramadım.

Yerel radyo parçaları mağazasında uygun hiçbir şey yoktu. Bu yüzden mucize mikro devreler için uzak ülkelere gittim. Eşyalarımı topladım, ceplerimi krakerlerle doldurdum, bir fincan kahve doldurdum, tarayıcıyı açtım ve gittim ... .
Parametrelere uygun bir motor sürücüsü buldum, ikisini birden sipariş ettim. Her ihtimale karşı, aniden biri arızalı olacak ya da kendimi yakacağım. Daktilo fikri o zaman ortaya çıkmaya başladı. Şanlı Çin'den paket geldikten sonra sürücüyü başarıyla değiştirdim ve makine onarıldı.

gecikmeden uzun kutu makinem fikri, yine temeli - gelecekteki makinenin şasisini seçmeye eğildim. Şasi farklıdır, çünkü Kara ulaşımı: paletli, tekerlekli, iki, üç, dört tekerlekli vb.

Kasayı nasıl seçtim

İlk olarak, bir kara taşıma modu seçtim, bu da bir kara şasisine sahip olacağım anlamına geliyor. Paletli şasi daha pahalı olma eğilimindedir ve çok hızlı değildir. İki-üç tekerlekli olanlar bana pek fena görünmüyor, böyle bir şasi yalnızca düz bir yüzeyde sürülebilir.
yerleştim. Kanımca, böyle bir şasi mükemmel arazi kabiliyetine ve hıza sahip olacaktır.


Şasi dahil:
olası tüm sensörleri, kontrol panolarını ve diğer bileşenleri monte etmek için bir dizi teknolojik deliğe sahip iki akrilik plaka
4 tekerlek
4 tam sürücü (motor + dişli kutusu)
Her tekerlek için bir tane olmak üzere hız sensörleri için yuvalı 4 disk
bağlantı elemanları
Evet, yine Çin. Evet, ucuz. Evet oldukça kaliteli. ANCAK! Önce denemek isteriz. Sonuçta, "yetişkin" şasi de yetişkin bir şekilde duruyor, henüz ona alışmadık.

Düşünce Bataklığı ve İş Tanımı

Örneğin, her türlü sensör, servo vb. ile bir model uydurma olasılıkları açısından umut verici bir şeyi elinizde tuttuğunuzda, bir düşünce bataklığında ve bir bakış açısı bataklığında boğulmaya başlarsınız. Ama kendimize söyleyelim - DUR! Ve kendimize bir prototip için mini bir TOR yapacağız. kısa açıklama tüm düğümler.
Bluetooth ile kontrol edilen, tekerleklerin dönüş hızını tersine çevirme ve sorunsuz bir şekilde kontrol etme özelliğine sahip bir kara aracının RC modelini almalıyız.

Makineyi monte etmek için neye ihtiyacımız var?

.


Döner tekerlek yoktur, bu da direksiyon kontrolünün paletli bir aracınki gibi olacağı anlamına gelir. Yani ileri/geri hareket için aktüatörlerin sağ ve sol tarafları aynı hızda dönmektedir. Ve bir dönüş yapmak için, kenarlardan birindeki dönüş hızı daha az veya daha fazla olmalıdır.


İçin uzaktan kumanda Bluetooth kanalını makine ile kullanıyoruz. "HC-06" modülü, verilerin her iki yönde de aktarılmasını sağlayan bir seri arabirim olan bir Bluetooth köprüsüdür. Girişte - mikrodenetleyiciye (hedef kart) bağlantı için "RxD" ve "TxD" seri arayüzünün TTL sinyalleri.
Uzaktan kumanda görevi görecek cep telefonu android ile. Programımızı yazalım!



Sürücü, sol ve sağ tekerlek çifti için iki kanallıdır. Sürücü, çıkışın polaritesini (dönüş yönü) değiştirmek için mantıksal girişlere ve bir PWM girişine sahiptir, dönüş hızını kontrol etmek mümkün olacaktır.


Bu pano seçildi çünkü çekmecede yatıyor ve tamamen amacımıza uygun. Ayrık girişler / çıkışlar vardır, "HC-06" nın bağlanacağı MK sinyalleri "RxD" ve "TxD" çıkışıdır.
İleriye baktığımda, Olimex MOD-IO ürününün zorlu bir iflas olduğunu söyleyeceğim. Hikayenin devamında tartışılacak olan olağan olanı uygulamak tamamen mümkün olacak!

Toplam: kasa + kontrol kartı + Bluetooth modülü + Android kontrol programı.

Genel bağlantı şeması

Saf haliyle bir devre değil, bir bağlantı şeması, çünkü sahip olduğumuz tüm panolar hazır ve geriye onları birbirine bağlamak kalıyor.

Proteus'taki Şema


Neyi ve nereye bağlandığımı tarif etmeyeceğim. Büyük olasılıkla farklı bir kontrol kartınız olacaktır. Ürün yazılımını düzenleyebilmeniz için kaynak kodlarını ekliyorum. Pekala, birisi anakartı için aygıt yazılımını derleyemezse, lütfen benimle iletişime geçin - boş zamanım olduğu kadar yardımcı olurum.

mikrodenetleyici programı

MK programı, bir Bluetooth modülünden bir seri arabirim aracılığıyla komutlar alabilir.
Ve komutlara göre sol ve sağ sürücü çiftini kontrol edin. Geri vites ve hız kontrolü PWM ile çalışır.

Kod iyi yorumlanmıştır. Veri alışverişi uygulamam üzerinde ayrıca durmak istiyorum.
Bir halka arabelleği aracılığıyla veri alımını gerçekleştirdim. Bu şey yeni değil ve birçok uygulama var.

Halka arabellek işlevlerim, aşağıdakilerden oluşan ayrı bir kitaplığa taşınır:
başlık dosyası ring_buffer.h ve işlev uygulama dosyası ring_buffer.c
Kütüphaneyi kullanmak için, onu main.c'ye eklemeniz gerekir.
#include "ring_buffer.h"

sonraki, içinde başlık dosyası kitaplığı yapılandırmanız gerekir. Yapılandırmak için yalnızca dört yönerge belirtmeniz gerekir:
#define RX_PACKET_SIZE 7 // RxD paket boyutu #define BUFFER_SIZE 16 // Alma arabelleğinin boyutu. İki kez olmalıdır RX_PACKET_SIZE #define START_BYTE "s" // Başlatma Baytı #define STOP_BYTE "e" // Durdurma Baytı

Aslında yapılandırılacak başka bir şey yok.

kodu kullanma Main.c'de mikrodenetleyicinin USART'ını yapılandırıyoruz.
USART kurulum işlevinin çağrılması
USART_Init(MYUBRR);

#define BAUD 9600 #define MYUBRR F_CPU/16/BAUD-1 void USART_Init(unsigned int ubrr) ( /* Baud hızını ayarla */ UBRRH = (unsigned char)(ubrr >> 8); UBRRL = (unsigned char)ubrr; /* Alıcı ve vericiyi etkinleştir */ UCSRB = (1<< TXCIE) | (1 << RXCIE)| (1 << TXEN) | (1 << RXEN); /* Set frame format: 8data, 2stop bit */ UCSRC = (1 << URSEL) | (0 << USBS) | (3 << UCSZ0); }

Bir veri paketi alma

USART alma baytı kesme işleyici işlevinde, yalnızca alınan baytı halka arabelleğe koymamız gerekir. Paketi daha sonra ayrıştıracağız.
ISR(USART_RXC_vect) ( uint8_t Data = UDR; RB_push_char(Data); // Alınan baytı halka tamponuna ekleyin)
Evet, şimdiye kadar herhangi bir çerçeve kontrolünü ihmal ettim.

Şimdi arabelleğimizi zaman zaman kontrol etmemiz kalıyor. Bunu yapmak için, halka arabelleğini kontrol etmeye izin verecek bayrağı ayarladığım bir zamanlayıcı başlattım.
ISR(TIMER0_OVF_vect) ( TCNT0 = 0x64; ReadRingBuffer = 1; )

Ana döngüde bayrağı kontrol etmek için bir koşul ekliyoruz.
if (ReadRingBuffer) ( if (RB_read_buffer((uint8_t*)&RxPacket) == 1) Tamponu oku ( // Paketi ayrıştır, bir şeyler yap ) ReadRingBuffer = 0; )

İşlev RB_read_buffer halka arabelleğini kontrol eder, paket boyutu, başlatma ve durdurma baytları yerlerinde ise - paket geçerli kabul edilir, işlev "1" döndürür. İşlev, bağımsız değişken olarak, alınan paketin ekleneceği yere bir işaretçi alır.
Daha fazla güvenilirlik için pakete bir sağlama toplamı sağlanabilir, ticari projelerimden birinde tam da bunu yaptım. Yani, boyutu kontrol etmek için, bayt başlat / durdur, bir sağlama toplamı kontrolü eklenir. Ama şimdilik onsuz yapalım.

Bir paketi nasıl açarım?

Şimdi en ilginç şey, paketi nasıl söktüğüm. Bir bayttan büyük veriler, işaret verileri, kayan nokta verileri bir paket içinde iletilebilir.
Şasi yönetimi için bir paket örneğini kullanarak açıklayacağım. Başlatma ve durdurma baytlarına ek olarak, paketimde sürücülerin sol ve sağ tarafları için bir komut ve iki PWM değeri göndermem gerekiyor. Bir komut için bir bayt benim için yeterli ve her PWM değeri için gönderiyorum int16- 16 bit, işaretli tip. Yani, bir yön bayrağı (bayt/özellik) geçirmiyorum. Yön değiştirmek için pozitif veya negatif bir PWM değeri iletiyorum.

Alıcı paket bir yapı şeklinde düzenlenmiştir.
struct RxPacket ( uint8_t StartByte; uint8_t Command; int16_t Left_PWM; int16_t Right_PWM; uint8_t StopByte; ) RxPacket;

Bir işlevi çağırmak RB_read_buffer ((uint8_t*)&RxPacket ), argüman olarak alıcı paketin yapısına bir işaretçi iletiriz. Yani bir paket alındığında RxPacket yapısında her şey kendi raflarına sıralanacaktır. Ardından, bu verileri yapıdan okumak kalır, örneğin şöyle:
lCmd = RxPacket.Command; lLPWM = RxPacket.Left_PWM; lRPWM = RxPacket.Right_PWM;

Veri paketi gönderme

Programımda transfer henüz kullanılmasa da, yine de transfer olasılığı uygulanmaktadır. Veri aktarımı daha kolaydır. Aynı şekilde alıcı paket için bir yapı oluşturalım:
struct TxPacket ( uint8_t StartByte; uint8_t Rc5System; uint8_t Rc5Command; uint8_t StopByte; ) TxPacket;

Nerede, bir başlatma ve durdurma baytı ve bir bilgi bölümü vardır. USART alıcısını zaten başlattık.
Bir paketin iletimini başlatmak için, fonksiyonu çağırırız.
void send_packet() ( // Başlangıç ​​baytını UDR kaydına yaz UDR = START_BYTE; )
Bu örnekte, bu fonksiyonda, sadece başlangıç ​​baytını UDR kaydına yazıyorum. Çok fazla değil gibi görünüyor, ancak aynı işlevde bir paketin hazırlanmasını veya faydalı başka bir şeyi gerçekleştirebilirsiniz. Ve bence bu daha mantıklı. Kendi kendini belgeleyen kod açısından mantıklıdır. Yani, eğer kodun içindeysem, sadece değeri UDR kaydına yazarım, bu sadece bir bayt aktarmak ve kendi kendine konuşan bir işlevi çağırmak olarak algılanabilir. gönder_paket()- Bir veri paketi gönderdiğim gerçeğinden bahsediyorum.

Ayrıca, USART vericisi UDR kaydından tüm baytı gönderdiğinde, iletim kesme işleyicisi çağrılacaktır.
ISR(USART_TXC_vect) ( unsigned char *Pointer = (unsigned char *)&(TxPacket); statik unsigned char TxIndex = 1; if (TxIndex)< sizeof(TxPacket)) { UDR = *(Pointer + TxIndex); TxIndex++; } else TxIndex = 1; }

İşleyicide bir işaretçi değişkeni bildiriyorum ve ona TxPacket yapısının adresini atıyorum. Ardından, statik bir değişken bildirilir - iletilen baytın dizini, bildirildiğinde değer atanır 1 . Bir ile başlıyoruz çünkü zaten yapıdan ilk byte'ı gönderdik. Genelde yapı içinde start byte olmadan da yapabilirsiniz, neyse ben ayrı gönderiyorum ama bu byte'ın bildirimi paketin nasıl göründüğünü anlamak için yapıda bırakılıyor.

koşul eğer (TxIndex< sizeof(TxPacket)) проверяет, что индекс меньше чем размер пакета. Если условие верно, то записываем байт в регистр UDR: UDR = *(Pointer + TxIndex);
TxIndex'i artırın. USART bir sonraki baytı gönderdiğinde tekrar işleyiciye gireceğiz ama yapıdan sonraki bayt aktarılacak ve böylece yapının tüm baytları aktarılacak. TxIndex yapının boyutundan büyük olduğunda koşul doğru olmaz ve else TxIndex = 1 olur; TxIndex'in başlatılacağı, ancak sırasıyla UDR kaydına hiçbir şey yazılmadığı durumlarda, bir sonraki paket iletimi başlatılana kadar işleyici artık çağrılmayacaktır. Böylece transfer işlemi tamamen otomatik oluyor ve paket yapısını değiştirsek bile işleyicinin yeniden yazılmasına gerek kalmıyor.

MK programının açıklamasının bir parçası olarak, sürücü yönetiminin uygulanması hakkında konuşmaya devam ediyor. Sürücü üç sinyalle kontrol edilir: A1 (B1), A2 (B2) ve PWMA (PWMB). A1 ve A2, sürücüyü açıp kapatmak ve çıkışın polaritesini değiştirmek içindir. PWMA girişine MK'den gelen bir PWM sinyali uygulanır - dönüş hızını kontrol edebilirsiniz. PWM sinyali için iki zamanlayıcı 1 donanım PWM'si kullandım.
#define _WGM13 0 #define _WGM12 1 #define _WGM11 0 #define _WGM10 1 // Timer 1 init TCCR1A = (1<< COM1A1) | (0 << COM1A0) | (1 << COM1B1) | (0 << COM1B0) | (_WGM11 << WGM11) | (_WGM10 << WGM10); TCCR1B = (0 << CS12) | (0 << CS11) | (1 << CS10) | (_WGM13 << WGM13) | (_WGM12 << WGM12); TCNT1 =0x0000; OCR1A = 0; OCR1B = 0;

Zamanlayıcı 16 bittir, ancak PWM 8 bit olarak başlatılmıştır. Ve muhtemelen zaten fark ettiğiniz gibi, alma paketinde sırasıyla sol ve sağ sürücüler için PWM'yi ayarlamak için iki değerim var. Değişkenler 16 bit olarak imzalandı.
Neden yaptığımı açıklayayım.

İlk önce, Android için programdan çıktı. Gerçek şu ki, Java'da işaretsiz türler yok ve ben zaten bu tırmığa bastım. Ve 0'dan 255'e bir sayı aktarmak için bir şekilde atlatmam gerekirdi. Daha basit bir yoldan gitmeye karar verdim - 16 bitlik imzalı bir numara gönderiyorum. Aynı zamanda işaretli bir türün 16 biti -32786'dan 32768'e kadardır, bu bizim için yeterlidir.

ikincisi, bu yüzden bence daha şeffaf - dönüş hızı ve yön sadece bir değişkenle açıklanıyor.

ve üçüncü olarak, ne derse desin, amaçlarımız açısından üç bayttan daha az tutmak imkansızdır. Bir baytı daha feda edelim, ancak her şey netleşiyor, pozitif bir PWM değeri ileri dönüş, negatif bir değer ise ters dönüş.

Sürücüleri kontrol etmek için bir fonksiyon yazdım sürücü(int solPWM, int sağPWM);.
void drive(int leftPWM, int rightPWM) ( // Sol tekeri İLERİ hareket ettir if (leftPWM > 0)( ClearBit(A2_PORT, A2_PIN); SetBit(A1_PORT, A1_PIN); ) // Sol tekeri GERİ hareket ettir if (leftPWM< 0){ ClearBit(A1_PORT, A1_PIN); SetBit(A2_PORT, A2_PIN); } // Движение ВПЕРЁД правое колесо if (rightPWM >0)( ClearBit(B2_PORT, B2_PIN); SetBit(B1_PORT, B1_PIN); ) // GERİ hareket sağ tekerlek if (rightPWM)< 0){ ClearBit(B1_PORT, B1_PIN); SetBit(B2_PORT, B2_PIN); } // Остановка if (leftPWM == 0){ ClearBit(A1_PORT, A1_PIN); ClearBit(A2_PORT, A2_PIN); } // Остановка if (rightPWM == 0){ ClearBit(B1_PORT, B1_PIN); ClearBit(B2_PORT, B2_PIN); } set_PWM((uint8_t)(abs(leftPWM)), (uint8_t)(abs(rightPWM))); }
PWM değerine göre A1(B1), A2(B2) sinyalleri kontrol edilir ve fonksiyon çağrılarak PWM değeri ayarlanır. set_PWM(solPWM, sağPWM).

Uf, bir nefes al...
Özetlemek gerekirse: paketi aldık, ayrıştırdık, PWM değerini fonksiyona ilettik. sürmek.

Arabalar için Android uygulaması

Hayır, MK için bir program kadar detaylı analiz etmeyeceğim. Android için yazılım geliştirme konusunda hâlâ yeniyim ve yetkin ve yeterince derinlemesine konuşmaya hazır değilim.

Programın ana işlevi- Bluetooth aracılığıyla HC-06 modülüne veri aktarımı. Programın karmaşık olmayan bir arayüzü var.

Yukarıda, bir modül seçmek için eşleştirilmiş Bluetooth cihazlarının açılır bir listesi bulunmaktadır. İlk başta bu liste yoktu ama makale üzerindeki çalışmanın sonunda bunu insanca yapmaya karar verdim çünkü herkes kaynak kodlarını anlayamayacak.

Ardından, "Kapalı" düğmesi - "HC-06" ile iletişimi etkinleştirir / devre dışı bırakır. Soldan sağa aşağıda: sol kanalın iletilen PWM değeri, sensör tipi, sağ kanalın değeri. Aşağıda, hız ve dönüşün hassasiyetini ayarlamak için iki kaydırıcı bulunmaktadır.

Program iki tip makine kontrolü uygular. Sensör tipini değiştirmek için, sensör adının yazısına dokunmanız gerekir: "Eğme" veya "Karıştırma".

1. Telefonunuzu eğerek makineyi kontrol edin. Telefonun sıfır konumu yataydır. Telefon öne eğildiğinde, PWM değeri eğimle orantılı olarak 0 ile 255 arasında değişir. Telefon geriye yatırıldığında PWM değeri 0 ile -255 aralığında eğimle orantılı olarak azalır.


Sola veya sağa dönmek için - telefonu sırasıyla ileri veya geri ve aynı zamanda sola veya sağa yatırmanız gerekir. Evet gerçek bir arabada olduğu gibi gaza basana kadar dönüş yapılmaz.

2. Kontrole dokunun. Böyle bir kontrol için ticari ismim "karıştırma"dır.


Bir dokunmatik yüzey olarak algılanabilir. Gri bir kareye dokunduğunuzda PWM değeri dokunma yerine göre artar/azalır, merkezden aşağı veya yukarı ne kadar uzaksa değer o kadar büyük/küçük olur.

"Güzel şeyler" veya zil ve ıslık yoktur. Hepsi bu gibi görünüyor.

"Kayak" üzerine biraz katran

Telefonumda bir pervaz var. Evet, kayak telefonu LG G2 mini. Üzerinde Bluetooth bağlantısı yeterince kurulmamış. Bağlantı, yalnızca Bluetooth uygulama başlatılmadan hemen önce açılmışsa normal şekilde kurulur.
Şunu yaptım: uygulamayı başlattığımda Bluetooth'un açık olup olmadığını kontrol ediyorum, kapalıysa açılması için istekte bulunuyorum. Ve "katladığımda", uygulamayı kapattığımda, Bluetooth'u zorla kapatıyorum.
Ve bir şey daha, ekran yönünü değiştirdiğinizde Bluetooth kapanıyor ve tekrar açmanız isteniyor, ekran dönüşünün otomatik olarak değiştirilmesini kapatmanız gerekiyor.

Özet

Sanırım amacıma ulaştım! Fazla çaba harcamadan, aklı başında orantılı kontrollü bir RC modeli oluşturdum. Makine bir yetişkin tarafından bile şevkle oynanabilir, yerinde U dönüşleri yapabilir, karmaşık dönüşler yapabilir, gerekirse yavaşlayabilir ve hızlanabilir.
Ve kırılırsa tamir etmesi kolaydır.

Hala bir faaliyet alanı var, büyüme için yer var. Şasiyi "kurabilirsiniz", telefon yazılımını yükseltebilir ve geliştirebilirsiniz.
Ve bu devam edecek!

Bir Arduino makinesinin, Bluetooth üzerinden bir Android cihaz tarafından kontrol edilen üç motordan nasıl monte edildiğinin ayrıntılı bir geçmişi. Birkaç düzine paragrafta, her bir kabloyu nereye bağlayacağımı, özel bir uygulamanın nasıl yazılacağını ve bir haftadan fazla bir süre boyunca hangi çocukların tırmığına atlamak zorunda kaldığımı olabildiğince adım adım açıklamaya çalışacağım.

Seviye, yazar ve uyarılar hakkında biraz

Ben, Moskova yakınlarındaki bir köyden 16-17 yaşlarında bir çocuk olan yazar, android uygulamaları yazma konusunda uzmanım (ve orada bir şeyler yakmak daha zordur), bu nedenle sorunları çözmek için en uygun yaklaşımın sorumluluğunu alıyorum.

Görev

En kolay görev, arabayı Arduino sürücüsü tarafından kontrol etmek ve uzaktan kumandayı bir android ile değiştirmek. Ama çoğu an tekerleği yeniden icat etmem gerekti çünkü internette uygun bir çözüm bulunamadı.

Sürer

  1. arduino
  2. Motor Kalkanı (benim durumumda iki tane)
  3. Bluetooth
  4. Android
  5. teller sıradan

Tasarım temeli

Temel olarak Lego Outdoor Challenger arabası alındı ​​(gerçekte daha az acıklı görünüyor). Ondan geriye kalan tek şey: gövde (tüm süslemeler kaldırıldı) ve üç motor.

Makinenin kendi kartı vardı, ancak görevlerden biri çok yönlülüğü gerektiriyordu: Ben yaptım, diğerleri tekrarlayabilir. Beyinleri çıkardım, Arduino Uno'yu koydum.

arduino kurulumu

Nedense yaratıcılar Arduino için bir yer sağlamadılar, bu yüzden plastiği delip vidalara sabitlediler. Hiçbir şeyin kısa devre yapmaması için tahtanın altına kontrplak koydum. Tahta demir cıvatalardan korunmadığından, vidaların altına plastik bir şey (bir şişe parçası) kaydırmak daha iyidir.

Hemen kartın üstüne iki motor korumalı koydum, bu yüzden gerekli. İkinciyi kontrol etmek için, bir kabloyu herhangi bir dijital bağlantı noktasından H1'e (yön) ve ikincisini de şim destekli bir pinden ("~" ile işaretlenir, genellikle 10, 11) E1'e (hız) geçirmeniz gerekir.

Dönme açısının belirlenmesi

Şaşırtıcı bir şekilde, makineyi döndürmekten bir servo sürücü değil, sıradan bir motor sorumludur. Bir sorun ortaya çıkıyor: yakmamak güzel olurdu çünkü dönüş açısı sınırlı ve motor gerektiği kadar dönebiliyor.

Dürtme yöntemi söz konusu değildir, çünkü farklı akü seviyelerinde motora verilen akım miktarı değişerek sürekli değişen bir açıya neden olur. Onu sonuna kadar çeviremezsin, er ya da geç dişliler parçalanacak.

Sorunun çözümü: Bir kapama boyunca açıyı takip edin. Fotoğraf, döndürme mekanizmasının yanına takılan küçük bir şeyi göstermektedir. Motor tarafından sağ/sol tekerleklerle dönen kısma demir kontaklı tarak takılır.

Çalışma prensibi: her hatta bir tel lehimlenir (toplamda dört tane vardır), alttaki artıya bağlanır (her zaman bir tarakla sıkıştırılır, resme bakın), tellerin geri kalanı eksiye gider . Tarak dişi hem alt sıraya hem de üçüncü sıraya çarptığında kısa devre olur, akım akar, bu Arduino tarafından fark edilir.

Üç şeridin çeşitli kombinasyonları sayesinde yedi adede kadar köşe tanımlanabilir. Örneğin tüm hatlarda akım varken çarklar en sağa, sadece üstten akım varken çarklar maksimum sola çevrilir. Tablo tüm seçenekleri gösterir.

Köşe bağlantısı ve kodu

Her seviye için farklı bir renk seçildi: alttaki yeşil, alttan birincisi kırmızı, ikincisi siyah, üçüncüsü beyaz. İlk aşamada, görsel hata ayıklama için bir devre tahtası ve LED'ler kullanıldı.

Bağlantı şeması şekilde gösterilmiştir. Artı yeşile çekiyoruz, gerisini eksiye çekiyoruz. Paraziti ve kısa devre olmamasını ortadan kaldırmak için kurulan bir direnç aracılığıyla, kabloları A0-A2 çıkışlarına bağlarız. Basitçe diğer bağlantı noktalarının kaydedilmesinden seçilirler.

Kod yorumlarla birlikte verilir. Pinleri birleştirip digitarRead() ile yoklarız. Voltaj varsa, true döndürülür. Sonra bakıyoruz, eğer sonuç tekerleklerin aşırı konumda olduğu anlamına geliyorsa, bu yönde daha fazla dönüşü yasaklıyoruz.

Küçük bir hile: Gelecekte 5V ve 3.3V çıkışlara ihtiyaç duyulacağından, dijital pinlerden birine artı koyabilirsiniz. Her açı kontrolünden önce, digitalWrite(whitePin) yoluyla çıkış akımı verin, ardından açıyı kontrol edin ve akımı çıkarın.

int hızdönüş = 180; // dönüş hızı, 0'dan 255'e // dönüşü belirlemek için pinler int pinRed = A0; int beyaz pin = A1; int pin Siyah = A2; int pinAngleStop = 12; //maksimum açıya ulaşıldığında akımı LED'e verir, //yalnızca hata ayıklamak için gerekli void setup() ( //pinleri okumak için pinMode(pinRed, INPUT); pinMode(pinBlack, INPUT); pinMode(pinWhite, INPUT); //LED pinMode(pinAngleStop, OUTPUT); //motor sürücü pinleri, yön ve hız pinMode(angleDirection, OUTPUT); pinMode(angleSpeed, OUTPUT); Serial.begin(9600); ) //döngüden çağrılan fonksiyon (), android'den bir komut geldiğinde void turn(int angle) ( digitalWrite(pinAngleStop, HIGH); //artı gecikmeye bağlı tele akım verin(5); //akımın "olması" için biraz bekleyin if(açı > 149 ) ( if(digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinBlack) == LOW) ( //en sağdaki konuma ulaşıldıysa çıkış //motor dönüşünün yanmasını önlemek için akım uygulamadan işlev; ) //açı maksimum değilse, çevirin digitalWrite(angleDirection, HIGH); analogWrite(angleSpeed, speedTurn); ) else if (açı< 31) { if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) { //если достигнуто крайне левого положение, выйти из функции не подавая ток, чтобы не //сжечь мотор return; } //если угол не максимальный, поворачиваем digitalWrite(angleDirection, LOW); analogWrite(angleSpeed, speedTurn); } digitalWrite(pinAngleStop, LOW); //убираем ток с определителя угла delay(5); }

Seyahat tekerleklerinin paralelleştirilmesi

Başlangıçta, iki tahrik motoru birbirine bağlanır. İki nedenden dolayı bağlantılarını kestim: tekerlekler farklı yönlerde dönerse dönüş daha verimli olur ve iki güçlü motor bir tahta tarafından çekilemez.

Sorun: Motor ekranının her biri 2 ampere kadar çıkan iki çıkışı vardır. Her motor 0.7A yiyor. Daha az görünüyor, ancak maksimum yüklerde değil. Diyelim ki makine kuma saplanmış veya dinlenmiş durumda, akım amperin üzerine çıkıyor. Kritik değil, ancak potansiyel olarak tehlikeli.

Ancak kartın ısıtılmasının kritik olduğu ortaya çıktı. Yarıştan bir buçuk dakika sonra motor kalkanı ısındı ve çirkin çalışmaya başladı: akımlar aynı değildi, tekerlekler dönmüyordu vb.

Her iki sorunun da çözümü: bir motor bir motor blendajına, ikincisi diğerine bağlı. İşin garibi, yardımcı oldu. Sıcaklık düştü, aşırı ısınma yok. Radyatör koymak mümkündü ama tamir etmesi zor.

Bluetooth bağlantısı

Ölümcül bir şaka yapan HC-05 modelini kullandım. Tüm bluetooth aynı şekilde bağlanır: 3.3V için bir kablo (bazen sadece 5V'dan çalışmaya başlar), ikincisi eksi için, iki tane daha port 0 ve 1 için (sırasıyla okuma ve gönderme). Bluetooth üzerindeki RXD imzalı tel, arduino TXD'ye ve TXD, RXD'ye takılır (karıştırırsanız, verileri göremezsiniz).

Bir uyarı var: 0 ve 1 numaralı bağlantı noktaları, çizimin yüklendiği Seri tarafından varsayılan olarak kullanılır. Yani bluetooth takılıyken eskiz yüklenmeyecek. İki çıkış yolu vardır: doldurma süresi boyunca bluetooth'u kaldırın veya bluetooth'un giriş ve çıkışlarını yeniden atayın. İkinci seçenek iki satırda gerçekleştirilir

#katmak \\SoftwareSerial kütüphane bağlantısı BTSerial(8, 9); \\ 0 ve 1 yerine 8 ve 9 pinlerini ayarlama
Üç günlük çalışmamı yiyen tuzak, iletişim hızıdır. Alışkanlık dışında 9600 kurdum ve denemeye gittim. Ya veriler gelmedi, sonra karakter karmaşası oldu. Ve sonunda cevap şu: HC-05 modeli 38400'de iletişim kuruyor! Setup() içinde Serial.begin(9600) olsa bile BTSerial.begin(39400)'ü çalıştıracağıma çok dikkat edin.

Komut gönderme sistemi

Makale çok uzuyor, bu yüzden Arduino ve Android kodunu ayrı bir ikinci bölümde ele alacağım ve şimdi prensibi açıklayacağım.

Android cihazın bir oyun çubuğu vardır (uygulaması yine ikinci bölümde olan bir daire). Android, okumaları okur ve bunları arduino için uygun sayılara dönüştürür: piksellerden gelen hızı -255 ila 255 (negatif - ters) arasında bir değere dönüştürür ve ayrıca açıyı da belirler. Çok daha güçlü olduğu ve saniyede birkaç yüz değeri saymakla kolayca başa çıkabileceği için bu görevi kasıtlı olarak telefona verdim.

Soket oluşturulduktan sonra veriler şu biçimde gönderilir: @speed#*angle#. @ - aşağıdaki hanelerin hız içerdiğini gösterir, # - hız değerinin sonunu bildirir, * - açı değerinin başlangıcını, # - açı kaydını bitirir. Döngü sonsuzdur, komutlar her 100 milisaniyede bir gönderilir (rakam en uygunudur). Android'de hiçbir şeye basılmazsa, hiçbir şey gönderilmez.

Veri alma algoritması, çizim kodunda ayrıntılı olarak açıklanmaktadır. Birden fazla yazıştı ve benim için mükemmel çalışıyor.

İlk bölümün sonucu

Bu yazıda makinenin fiziksel kısmı ile ilgili her şeyi ortaya koymaya çalıştım. Büyük olasılıkla, bir şeyi kaçırdım, bu yüzden sorduğunuzdan emin olun.

Ama benim için en ilginç olanı ikinciye kaldı - Arduino programı ve Android uygulaması, en azından genç benim için gerçek bir sihir oluyor.

Herhangi bir parçanın cevabını bulamadıysanız ve eksiklikleri bizzat beni dürtmek istiyorsanız, bekliyorum - [e-posta korumalı], .

UPD: ikinci bölüm zaten çıktı -

Yazımızda Arduino'yu bluetooth üzerinden bağlamayı ve kontrol etmeyi ele alacağız.

Bluetooth modülü olarak yaygın olarak kullanılan hc-06 kullanılacaktır.

Projemizde bluetooth ile port 13'e bağlı led'i açıp kapatacağız.

Bir android akıllı telefon için bir uygulama yazarak başlayalım. Uygulama, kullanışlı ve basit bir App Inventor programlama ortamında yazılacaktır. Programlar çevrimiçi olarak derlenecektir.

http://ai2.appinventor.mit.edu/ bağlantısını takip edin. Orada, henüz bir hesabınız yoksa oluşturmanız gereken bir Google hesabında oturum açmanız istenecektir.

Giriş yaptıktan sonra "yeni proje başlat" butonuna tıklayarak proje oluşturabileceğiniz programa yönlendirileceksiniz. Bir proje adı girmeniz gerekecek. Buna led_control diyelim.

Boş bir uygulama penceresi açılacaktır.

Burada gerekli bileşenleri yerleştireceğiz. Soldaki pencerede ListPicker'ı seçin ve projeye yerleştirin.

Sağdaki pencerede ListPicker bileşeni için, Text özelliğini bulun ve "Text for ListPicker1" öğesini "BT Aygıtını Seç" olarak değiştirin.

Soldaki pencerede Layout sekmesini açın, uygulamaya bir HorizontalArrangement bileşeni yerleştirin, Width özelliğini "Fill parent" olarak değiştirin. HorizontalArrangement öğesine 2 Düğme ekleyin, her biri Width özelliğini "Ana öğeyi doldur" olarak ayarlayın. Bunun gibi çıkmalı:

Düğmelerdeki etiketleri değiştirelim: ilk yazılacak LED AÇIK, ikinci - LED KAPALI.

Aşağıda bir Etiket ekliyoruz ve Metnini temizliyoruz.

Bluetooth üzerinden veri aktarımını düzenleyen bir bileşen eklemeye devam ediyor. Bağlantı sekmesini açın ve BluetoothClient projesine yerleştirin. Bu bileşen telefon ekranında değil, altında olacak çünkü. görsel değildir.

Artık programı yazmaya başlayabilirsiniz. Programın sağ üst kısmında Blok modunu seçin.

Burada program grafik bloklardan derlenecektir. Soldaki ListPicker1 bileşenine tıklayın ve ListPicker1.BeforePicking'i seçin.

ListPicker1'e tekrar tıklayın ve ListPicker1.Elements'i şu şekilde ayarla'yı seçin:

Ekran görüntüsündeki gibi koyun.

Bu bize eşleştirilmiş bluetooth cihazlarının bir listesini verir. Şimdi seçilen cihaza bağlanalım. Aşağıdaki ekran görüntüsündeki gibi bir blok yazın.

Bağlandı etiketli pembe kutu, Metin sekmesindeki ilk kutudur. Boş kutuya Bağlandı yazın.

Şimdi düğme işleyicisini yazalım. İlk butona tıklamak “led_on” yazısını, ikinci butona tıklamak ise “led_off” yazısını gönderir. Label1'deki yazıt da değişecektir.

Projeyi akıllı telefonunuza indirmek için kalır. Oluştur'a tıklayın ve bir indirme yöntemi seçin.

İlk seçenek için internete ve bir QR kod okuyucuya ihtiyacınız olacak. Tıklayın ve proje montajının tamamlanmasını ve QR kodunun oluşturulmasını bekleyin, ardından akıllı telefonunuzdaki QR kod okuyucuyu açın ve kodu okuyun. Geriye sadece dosyayı indirip kurmak kalıyor.

İkinci seçenekte, .apk formatındaki proje bilgisayarınıza kaydedilecek ve onu herhangi bir uygun şekilde (örneğin USB aracılığıyla) akıllı telefonunuza indirebilirsiniz.

Şimdi Arduino programı ile başlayalım.

Verilerin alınması ve iletilmesi COM bağlantı noktası üzerinden gerçekleştirilir, bu nedenle Seri kullanacağız. Sinyalleri karakter karakter alacağız, bir dizi oluşturacağız ve sonra üretilen diziyi led_on ve led_off komutlarıyla karşılaştıracağız.

arduino

Dizi değeri = ""; void setup() ( Serial.begin(9600); pinMode(13, OUTPUT); ) void loop() ( while (Serial.available()) ( //veriler gelirken char c = Serial.read(); / / onları oku val += c; //ve bir string delay(3); ) if (val != "") ( Serial.println(val); ) if (val == "led_on") ( digitalWrite(13) , YÜKSEK); ) else if (val == "led_off") ( digitalWrite(13, LOW); ) val = ""; )

Dize val = "" ;

geçersiz kurulum()(

Seri. başla(9600) ;

pinMode(13, ÇIKIŞ) ;

geçersiz döngü()(

while (Seri . mevcut () ) ( // veriler gelirken

karakter c = Seri. Okumak(); //onları oku

val += c ; // ve bir dizi oluştur

gecikme(3) ;

}

Arduino'ya kod yükleyin.

Artık HC-06 Bluetooth modülünü bağlayabilirsiniz. Çok basit bir şekilde bağlanır:

Vcc 5v (3.3v olabilir)

ARDUINO'DAKİ PROGRAMI BAĞLANTILI BİR MODÜL İLE YÜKLEMEYE ÇALIŞIRSANIZ HATA OLUR, T.K. HEM MODÜL HEM YAZILIM İNDİRME RX VE TX PORTLARINI KULLANIR!

Arduino'yu çalıştırın. Bluetooth modülündeki LED yanıp sönmelidir, bu da bir bağlantı beklediği anlamına gelir. Bir akıllı telefon alın, ayarlarda bluetooth'u bulun, açın ve aramaya başlayın. hc-06 adlı bir cihaz bulun ve ona bağlanın. İlk seferde çalışmayabilir. Başarılı bir eşleştirmeden sonra programı akıllı telefonunuzda çalıştırabilirsiniz.

İlk olarak, "BT cihazı seç" üzerine tıklayın ve eşleştirilmiş cihazlardan modülü seçin. Ardından, LED için açma ve kapama düğmelerine basın. Her şey doğru yapılırsa, her şey işe yarayacaktır.

Herhangi bir tasarım yapmadan hatta modüle bağlı olup olmadığımızı kontrol etmeden Bluetooth kullanarak çok basit bir uygulama yaptık. Sonraki derslerde daha karmaşık uygulamalar yapacağız ve App Inventor'u daha iyi tanıyacağız.

Çoğu zaman projelerinizde uzaktan kontrole veya telefon cihazlarınızdan veri aktarımına ihtiyaç duyulur.

Bluetooth üzerinden en popüler ve yaygın veri alışverişi yöntemlerinden biri .

Bugün, Bluetooth'u nasıl bağlayabileceğinize dair basit örnekleri analiz edeceğiz. modülünü Arduino'ya bağlayın ve telefonunuzdan uzaktan kumandayı kurun.

İhtiyacımız olacak:

  • BABA-MAMA tel seti
  • HC-06 Bluetooth

Bluetooth'u bağlayın Arduino mikrodenetleyicisine giden modül en uygun şekilde PAPA-MAMA kablolamasını kullanıyor.

arduino Bluetooth
Pim 1 (TX) RXD
Pim 0 (RX) Teksas
GND GND
5V VCC

Dikkatli olun, bağlanmanız gerekiyor Teksas -> RXD ,RX -> Teksas .

Şimdi bir test programı kodu yazmanız gerekiyor:

Çizimi yüklerken, Bluetooth modülünün arduino mikrodenetleyicisinden ayrılması gerekir. Aksi takdirde, Bluetooth bağlantısı nedeniyle çizim kaydedilmeyecektir. modülü, USB ile aynı RX ve TX bağlantı noktasında bulunur.

aralık; int LED'i = 13; void setup() ( Serial.begin(9600); pinMode(LED, OUTPUT); digitalWrite(LED, HIGH); ) void loop() ( if (Serial.available()) ( val = Serial.read(); / / "1" karakterinde LED'i açın if (val == "1") ( digitalWrite(LED, HIGH); ) // "0" karakterinde LED'i kapatın if (val == "0") ( digitalWrite(LED, DÜŞÜK ); ) ))

Kroki kaydedildikten ve Bluetooth'tan sonra modül Arduino'ya bağlı, bir sonraki adıma geçebilirsiniz.

Telefona Bluetooth bağlantısı

Arduino için güç kaynağı olarak USB değil, harici bir 9 V güç kaynağı kullanılması tavsiye edilir.

  1. Telefonunuzda Bluetooth'u açın ve yeni cihazlar arayın
  2. Bozukluklar listesinde buluyoruz " HC-06" ve ona bağlanın.
  3. Telefon bir pin kodu isteyecektir. girmeniz gerekiyor" 1234 " veya " 0000 "
  4. Yaşasın. Cihaz bağlandı.

Şimdi bluetooth terminalini telefonunuza indirmeniz gerekiyor. Android platformu örneğine bakacağız.



Farklı bluetooth terminalleri kurabilirsiniz, kural olarak yalnızca farklı tasarımlarda farklılık gösterirler, işlevsellik bundan değişmez. Ayrıca ios ürünleri için bir terminal de bulabilirsiniz.

Terminali kurduktan sonra başlatıyoruz, HC-06 bluetooth modülümüzü seçip ona bağlanıyoruz.

Projeyi uygulamalı olarak deneme zamanı. Terminalde "0" sayısını yazıp gönderiyoruz. Arduino kartındaki pin 13'ün yanındaki L LED'i sönmelidir. Şimdi terminal üzerinden "1" sayısını göndereceğiz ve L LED'i yanmalıdır.

Çalışma demosu:


Ev ödevi:

  • Çizimi, LED aynı komutla, örneğin "G" ile açılıp kapanacak şekilde değiştirin.
  • Bir taslak ekleyin ve ona bluetooth aracılığıyla gelen metin verilerinin dijital verilere nasıl dönüştürüleceğini öğretin ve bir dimer uygulayın, PWM kullanarak LED'i bluetooth aracılığıyla gelen 0'dan 254'e kadar belirli bir parlaklığa getirin.

Arduino platformunun ve çeşitli robotik platformların yaygın ve düşük maliyetli olması, amatörlerin her zevke uygun radyo kontrollü arabalar yaratmasına olanak sağlamıştır. Akıllı telefonların yaygınlaşması da bu makinelerin kontrolör olarak kullanılmasını mümkün kıldı. Birçok Arduino meraklısı için temel sorun, Android programlama deneyiminin olmamasıdır. Bugün size android uygulamalar için App Inventor 2 görsel geliştirme ortamını kullanarak bu sorunu kolayca nasıl çözeceğinizi anlatacağım.



Herhangi bir daktilonun yapımı donanımla başlamalıdır, bu yüzden daktilomda ne kullandığımı kısaca anlatacağım:
arduino nano
bluetooth modülü HC-05
Z-Mini Motor Sensör Kalkanı L293D
2WD Motorlu Şasi
Donanım konfigürasyonu bu projede büyük bir rol oynamaz, bu nedenle şasi, kalkan ve arduino'nun kendisi herhangi bir analogla değiştirilebilir.

Şimdi bir Android uygulaması oluşturmaya geçelim. App Inventor, bir tarayıcıdan çalışan android uygulamaları için görsel bir geliştirme ortamıdır. Siteye gidiyoruz, Google hesabınıza erişime izin veriyoruz, "oluştur" düğmesini tıklıyoruz ve yeni bir proje oluşturuyoruz. Yeni projemizde "Sürükle ve Bırak" yöntemini kullanarak hareket yönünü seçmek için 4 adet ve bluetooth modülümüze bağlanmak için bir adet buton oluşturuyoruz. Bunun gibi:

Şimdi "Oluştur" düğmesine tıklayarak uygulamayı derlemeye devam ediyor.

Arduino hayranlarının eskiz yazmakta bir sıkıntı yaşamayacaklarını düşünüyorum, sadece makinenin siral port üzerinden bilgisayardan kontrol edildiği hazır eskizlerden seçim yapabileceğinizi söyleyebilirim. bunu kullandım

eskiz

int değeri;
int IN1 = 4;
int IN2 = 7;
int EN1 = 6;
int EN2 = 5;

geçersiz kurulum()
{
Serial.begin(9600);
pinMode(IN1, ÇIKIŞ);
pinMode(GİRİŞ2, ÇIKIŞ);
pinMode(EN1, ÇIKIŞ);
pinMode(EN2, ÇIKIŞ);

}
boşluk döngüsü()
{
if(Seri.kullanılabilir())
{
val = Serial.read();

// ileri hareketi ayarla
if (val == "W") // "W" tuşuna basıldığında
{
// Pinler, Motor Kalkanı işlemine göre yapılandırılır
// Motorlar ileri dönüyor
digitalWrite(EN1, YÜKSEK);
digitalWrite(EN2, YÜKSEK);
digitalWrite(IN1, YÜKSEK);
digitalWrite(IN2, YÜKSEK);
}

// Hareketi geri ayarla
eğer (val == "S")
{
digitalWrite(EN1, YÜKSEK);
digitalWrite(EN2, YÜKSEK);
digitalWrite(IN1, DÜŞÜK);
digitalWrite(IN2, DÜŞÜK);
}

// Hareketi sağa ayarla
eğer (val == "D")
{
digitalWrite(EN1, YÜKSEK);
digitalWrite(EN2, YÜKSEK);
digitalWrite(IN1, YÜKSEK);
digitalWrite(IN2, DÜŞÜK);
}

// Hareketi sola ayarla
eğer (val == "A")
{
digitalWrite(EN1, YÜKSEK);
digitalWrite(EN2, YÜKSEK);
digitalWrite(IN1, DÜŞÜK);
digitalWrite(IN2, YÜKSEK);
}

// Durdurma modu
// Programda tuşlar bırakıldığında porta "T" gönderilir
if (val == "T") // "T" tuşuna basıldığında
{
// ENABLE pinleri negatif çekildi, motorlar çalışmıyor
digitalWrite(EN1, DÜŞÜK);
digitalWrite(EN2, DÜŞÜK);
}
}
}


Yani, makinem şöyle görünüyor:

Uygulamalardaki tasarımı sevenler biraz değişiklik gösterebilir. Bunu nasıl yapacağımı ayrıntılı olarak açıklamayacağım, kendiniz anlamak zor değil. Bunun için temelde şeffaf bir arka planı desteklemeyen .jpeg yerine .png dosyalarını kullanmanız gerektiğini söyleyeyim. Örneğin, herhangi bir hazırlıksız kişi böyle bir tasarımı yarım saatte veya bir saatte yapabilir:

Not: App Inventor 2'de uygulama geliştirme deneyimi yaşamamış olanlar için bu uygulamayı geliştirme konusunda daha ayrıntılı bir rehber hazırladım (görüntülemek için YouTube'a gitmeniz gerekiyor).

P.P.S. Yeni başlayanlar ve profesyoneller için 100'den fazla arduino öğretici koleksiyonu