Getting Started STM32F103C Board with Arduino IDE [EP2]

การทดลองการเรียนรู้การใช้งานบอร์ดควบคุม STM32F103C8T6 ในตอนที่่ 2 ครั้งนี้ เป็นการทดลองใช้ฟังก์ชั่นต่างๆ ของบอร์ดควบคุมกันต่อ ในเรื่องของการส่งข้อมูลต่างๆ ไปยังหน้าต่าง Serial Monitor, การส่งสัญญาณลอจิกไปยังขาเอาต์พุต, การรับสัญญาณลอจิกขาอินพุต และการอ่านค่าสัญญาณอะนาลอกขนาด 12 บิต โดยเนื้อหาจะเป็นตัวอย่างการทดลอง 3 แบบ ทั้งนี้เพื่อเป็นความรู้พื้นฐานนำไปประยุกต์ใช้งานต่างๆ ต่อไป

รูปที่ 1 แสดงการต่ออุปกรณ์ต่างๆ สำหรับทดลองการทำงานให้กับบอร์ดควบคุม STM32F103C8T6 คือเป็นการเชื่อมต่อบอร์ด USB to Serial กับบอร์ด STM32F103C8T6 ที่ตำแหน่งขา PA9 และ PA10 สำหรับโปรแกรมคำสั่งและรับ/ส่งข้อมูลที่หน้าต่าง Serial Monitor, การต่อแอลอีดีที่ขา PB12, การต่อสวิตช์ที่ขา PB0 และการต่อตัวต้านทานปรับค่าที่ขา PA0 ซึ่งจะใช้ในการทดลอง 3 แบบ สำหรับการทดลองในตอนที่ 2 นี้
/* Lesson 1: Serial Monitor and LED PB12 Blink */
void setup() {
pinMode(PB12, OUTPUT);
Serial.begin(9600);
}
void loop() {
Serial.println(" www.electronicsDNA.com");
digitalWrite(PB12, HIGH); // turn the LED on (HIGH is the voltage level)
delay(500); // wait for a second
digitalWrite(PB12, LOW); // turn the LED off by making the voltage LOW
delay(500); // wait for a second
}

การทดลองที่ 1 เป็นการส่งสัญญาณลอจิกไปยังขาเอาต์พุต PB12 เพื่อควบคุมการการติด/ดับ ให้กับแอลอีดีทุก 0.5 วินาที และให้ส่งข้อความ www.electronicsDNA.com ไปยังหน้าต่าง Serial Monitor ตลอดเวลา โดยใช้โปรแกรม Lesson 1: Serial Monitor and LED PB12 Blink ซึ่งผลการทดลองดังแสดงในรูปที่ 2 และการทดลองนี้จะเป็นการควบคุมขาในระดับบิตและทดสอบการส่งข้อความต่างๆ ไปยังหน้าต่าง Serial Monitor ของโปรแกรม Arduino IDE
/* Lesson 2: Pushbutton PB0 Control LED PB12 */
const int buttonPin = PB0;
const int ledPin = PB12;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
// INPUT_PULLUP keeps pin HIGH when button is NOT pressed
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// Read button state (0 = Pressed, 1 = Not Pressed)
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
digitalWrite(ledPin, HIGH); // Turn LED ON
Serial.println(" SW ON");
} else {
digitalWrite(ledPin, LOW); // Turn LED OFF
}
}

การทดลองที่ 2 เป็นการรับสัญญาณลอจิกมายังขาอินพุต PB0 พร้อมกับการควบคุมการการติด/ดับ ให้กับแอลอีดีที่ขา PB12 และให้ส่งข้อความ SW ON ไปยังหน้าต่าง Serial Monitor ให้ทราบ โดยใช้โปรแกรม Lesson 2: Pushbutton PB0 Control LED PB12 ซึ่งผลการทดลองดังแสดงในรูปที่ 3 สำหรับการทดลองนี้จะเป็นการทดลองรับค่าสัญญาณลอจิกและกำหนดขาอินพุตระดับบิต รวมถึงการส่งข้อความไปยังหน้าต่าง Serial Monitor ของโปรแกรม Arduino IDE
/* Lesson 3: Analog Read & Serial Monitor */
const int potPin = PA0; // ADC Pin
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(potPin); // Reads 0 - 4095
Serial.print(" ADC0 = ");
Serial.println(sensorValue);
delay(200);
}

การทดลองที่ 3 เป็นการอ่านค่าสัญญาณอะนาลอกขนาด 12 บิต มายังขาอินพุต PA0 และให้ส่งเป็นข้อความ ADC0 = xxxx ไปยังหน้าต่าง Serial Monitor ให้ทราบ (ค่า xxxx คือระดับของสัญญาณอะนาลอกที่อ่านได้) โดยใช้โปรแกรม Lesson 3: Analog Read & Serial Monitor ซึ่งผลการทดลองดังแสดงในรูปที่ 4 และการทดลองนี้จะเป็นการทดลองการอ่านค่าสัญญาณอะนาลอก รวมถึงการส่งค่าสัญญาณอะนาลอกที่อ่านได้เป็นข้อความไปยังหน้าต่าง Serial Monitor ของโปรแกรม Arduino IDE เช่นเดียวกับการทดลองที่ 1 และการทดลองที่ 2 ท้ายนี้สำหรับการทดลองทั้ง 3 แบบตามที่กล่าว เพื่อเป็นความรู้พื้นฐานนำไปประยุกต์ใช้งานต่างๆ ต่อไป
Reference
- https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html
- https://www.st.com/resource/en/datasheet/stm32f103c8.pdf
- https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json
- https://www.pcb-hero.com/blogs/lickys-column/stm32f103c8t6-blue-pill-development-board
- https://forum.arduino.cc/t/wiring-uart-communication-between-arduino-nano-softserial-and-stm32f103c8t6/638799/2
- https://reversepcb.com/stm32f103c8t6/
- https://www.instructables.com/How-to-Program-STM32F103C8T6-With-ArduinoIDE/