STM32F4-Discovery kartı, micropython, ADC ve İvme sensörü

Bölüm – IV

Bir yeni bölüm de daha birlikteyiz. Bugünkü bölümde iki kısımda; yeni iki donanım inceleyeceğiz. Birisi ADC, diğeri de ivme sensörü.

ADC, genelde mcu içine gömülüdür. Ancak farklı uygulamalar içerisinde kullanmak için üretilmiş, ADC entegreleri de mevcuttur. Bugün dahili ADC birimi ile bir kaç örnek yapacağız.

Diğer donanım ivme sensörü; çoğunlukla harici bir donanımdır. SPI/I²C gibi donanımlar ile mculara bağlanmaktadır.
Yapacağımız diğer örnek ivme sensörünü, eğim sensörü gibi kullanmaya çalışacağız. Eğimde oluşan ivme değerini ledlere bağlayacağız. Buradaki amacımız farklı donanımlar ile örnekler yapıp kullanımlarını öğrenmemiz.


Bir çok mcu içinde artık neredeyse olmazsa olmaz ADC birimi ile başlayalım. Epeyce eski bir birim olduğundan hem donanım içerisinde, hem de yazılımlar içerisinde okuma çok basitleştirilmiştir. Ancak bunun yanında; gelişen mcu teknolojisi ile birlikte daha kapsamlı yapılandırmalar da bulunmaktadır.
STM32F407V içerisinde 12-bit, 16 kanal(0-15) A/D çevirici bulunmaktadır. Ben daha önceki çalışmalarım için yaptığım, dört kanal pot modülünü kullanacağım.

Bu basit proje, EasyEDA ile çizildi ve https://oshwlab.com/mehmetbey/4ch-pot_01 linkinde paylaştım.

Dört kanal pot şeması

Bu mcuda bir de; sıcaklık sensörü, Vrefint ve Vbat bulunmakta 16, 17 ve 18. kanal olarak okunuyor. Sıcaklık sensörü, çok hassas olmadığı kataloğunda yazmaktadır. Bunu sadece sıcaklık değişimlerinin takibi için olduğu belirtilmektedir. Bir örnek de bunlar için yapacağız.


ADC tanımlamasını ve basit bir örnek yapalım. Discovery board P1; 7-10 pinleri ADC 10-13 pinlerine bağlıdır. Bu pinler PC0-PC3 arasındaki 4 pindir. Alttaki kodu terminale yazalım. PC0 ‘a bağlı olan potu ora bir noktaya getirelim. 12-bit değer okuyacağız. Bu durumda; pot orta noktada iken yaklaşık 2048 değerini görmemiz gerekmektedir.

Yaklaşık bu değeri gördüysek sorun yok. Ancak göremediysek, pin bağlantılarını ve kodlarımızı gözden geçirelim.
Aynı şekilde diğer pot kanallarını da deneyebiliriz. Alttaki kodlar ile dört kanalı devamlı okuyoruz.

Basit uygulamalarda ADC.read() metodu işe yarar. Ancak bazı sensör uygulamalarında, gerilim izleme uygulamaları, vb. uygulamalarda; okunan değerler yazılımsal filtrelerden geçirilmesi gerekmekte. Bu gibi durumlarda farklı okuma işlemleri yapılabilir. Örneğin, belli zamanlarda örnek alıp bir diziye aktarılır. Daha sonra bu dizi istenilen şekilde değerlendirilebilir. Şimdiki örneğimizde sadece terminale yazdıracağız. Siz istediğiniz şekilde kullanabilirsiniz; ortalaması alınabilir, medyan fitre uygulanabilir, vs.

Üstteki örnekte buf dizisi 8-bit. Okunan 12-bit değer, 8-bite dönüştürülerek diziye aktarılır.
Eğer 12-bit değerlere ihtiyacımız varsa array modülü kullanarak yapabiliriz.

ADC içerisinde bir de sıcaklık sensörünün olduğundan bahsetmiştik. Bunu okutabilmek için pyb.ADCAll modülü kullanılmaktadır. Aslında normal ADC kanallarını da okumak mümkün.
Bu modül tanımlanırken; hangi kanalların ADC olarak okunacağı(mask) ve çözünürlüğü belirtilmektedir. Kullandığımız mcuda 16 kanal(0-15) ADC birimi bulunmakta idi. Ancak 16-18 arası bitlerin sıcaklık sensörü, Vrefint ve Vbat olduğunu söylemiştik. dolayısıyla mask değerinde bu 3-bitin de eklenmesi gerekmekte.

Biz bu örneğimizde şimdilik, sadece bu üç değeri okuyalım.

Daha önce de söylemiştik; sıcaklık sensörü hassas değil. Sadece sıcaklık değişimlerini gözlemlemeye yarıyor.
Şimdilik ADC konusu bu kadar, gerisi sizin hayallerinize kalmış. Bol bol örnek yapınız.


Discovery borduna harici olarak bağlı olan donanımlardan birisi de ivme sensörü. Benim elimdeki kart; MB997C. Bu model üzerindeki sensör LIS3DSH. Buradaki linkte Discovery kart üzerindeki ivme sönsörlerine uygun yazılmış modül bulunmakta. Bu bu modülü; staccel.py adıyla flash alanına kaydedelim. Ardından alttaki uygulamayı yazalım:

Kartı hareket ettirdiğimizde ekrandaki değerlerin değiştiğini görmekteyiz. Bu haliyle en fazla ±2g değer üretebiliyor. (1g = 9.8m/s²)
Bu sensör 16g ‘ye kadar değer üretebilmekte. Eğer siz isterseniz; staccel.py dosyasını; LIS3DSH sensörünün belgelerine bakarak yeniden düzenleyebilirsiniz. Böylece istediğiniz ivme değerlerini almanız mümkün olacaktır.

Ben bu modülde bir değişiklik yaptım. Modüle erişildiğinde LIS3DSH yada LIS302DL ivme sensörünün bulunduğunu terminale yazıyor. staccel.py dosyasının 58. satırından sonra bir boşuk ekleyin ve 57. satırdaki else hizasında, 58. satıra alttaki kodu ilave edin.
print("\nLIS3DSH bulundu.\n" if (self.who_am_i == 0x3F) else "\nLIS302DL bulundu.\n")

Şimdi son olarak ivme sensörünün değerine bağlı olarak kart üzerindeki ledleri; pwm duty değerine bağlı olarak yakan bir uygulama yazalım. Bu örnekte X/Y düzlemindeki değerlere göre ledlerin duty değerine bağladım.

Benim masada yaklaşık 0.15 değer civarında hata veriyor, muhtemelen masa bir kaç derece eğimli. <USER> buton ile bu değerin sıfırlanmasını sağladım.

Bugünkü biraz uzun bir yazı oldu. Umarım eğlenceli olmuştur. micropython ve Discovery kartı hakkında biraz daha fazla bilgimiz olduğunu düşünüyorum. Aklınıza takılan yerleri; “Hakkımda” alanından ulaşabileceğiniz bir posta adresim bulunmakta. Bilgim dahininde cevaplamaya çalışacağım.

İyi eğlenceler…

7 segment 7segment 12F675 12F683 ADC Arduino AVR AvrDude BUTON button Code Composer Studio Direnç esp esp8266 G2552 GLCD itoa led LIS3DSH LIS302DL micropython MPLABX MSP430 ortanca filtre pendulum PIC PIC18F452 port PWM PySimpleGUI python pyttsx3 seven segment STM32 STM32F-Discovery STM32F4-DISCO STM32F4-Discovery STM32F407 Thonny Timer0 usb Voltmetre XC8 Zener test cihazı İvme Sensörü