วันศุกร์ที่ 3 เมษายน พ.ศ. 2558

Arduino note : MIDI Mario song ดุ่ม ดุม ดุ้ม 3/4/15

Arduino note : MIDI Mario song ดุ่ม ดุม ดุ้ม  

                     ได้ลองต่อcoding ลองส่งค่าไปให้MIDI box  ทดสอบคำสั่งnoteOn   noteOff  progchange และ pitchBend  
         ซึ่งตอนแรกให้ลองเปลี่ยนค่าของprogchange และ pitchBend ทีละครั้ง สามารถทำได้ แต่พอลองวางแผนว่าจะให้เช็คค่าและใส่พร้อมกันสองตัวกลับทำไม่ได้ 
เช่น อยากให้ กด pc111 แล้วprogchange เครื่องดนตรีไปตามเลขนั้นๆ หรือ กด pb121123 .แล้วให้เปลี่ยนค่า LSB MSB       ซึ่งค่อนข้างซับซ้อนและลำบากในการเปลี่ยนแต่ละครั้งมาก อีกทั้งข้อมูลของคีย์บอร์ดที่ส่งไปเป็นASCII ทำให้programสับสนค่าที่จะนำมาใช้ในการเช็ค และค่าที่จะส่งออกไปเป้นเสียง ซึ่ีงหมายความว่าหากใช้วิธีเช็คทีละตัวตามนี้จะเกิดเสียงออกมาทุกครั้งที่read และนำค่ามาใช้ หรือค่าที่ออกจากบอร์ดนั่นเอง

                 หลังจากนั้นได้ลองทดสอบนำnoteเพลงมาแปลงเป็นคำสั่งส่งออกไปให้ MIDI  box และลองใช้คำสั่ง noteOn กับ channel อื่นด้วย 


                 plan: 1.เขียนโน้ตเพลงทั้งหมดก่อน 
                          2.แปลงโน้ตทุกๆตัวเป้นเลขตาม table ที่ได้มา
                          3.สร้างfunction noteOn noteOff และ progchange 
                          4.กำหนดค่า baurd rateที่ 31250 ด้วยคำสั่ง Serial.begin(31250);
                          5.สร้างloop forหนึ่งอันโดยให้forเป็นตัวกำหนดห้องหนึ่งห้องของโน้ตดนตรี (1ห้อง 
                          มีทั้งหมด 4 sec )
                          6.นำเลขตัวโน้ตมาใส่ในfunction noteOn และจังหวะหยุดให้ใส่ใน functionของ noteOff
                          7. Complied ใส่board ลองฟังจังหวะ เสียง และแก้ไขเพิ่มเติม
                          8.เมื่อnoteเพลงokแล้วลองเขียนให้รับค่าเข้าจากคอมเพื่อเปลี่ยนเครื่องดนตรี 
                          9.ทดสอบส่งค่าด้วยprogram docklight (Serial monitorของArduinoไม่สามารถเปลี่ยนbaud rate เป้น31250 ได้จึงต้องใช้โปรแกรมอื่นช่วย )
                         10. ทดสอบลองฟังอีกครั้ง หากผิดพลาดให้แก้ไขเพิ่มเติม







วันอังคารที่ 24 มีนาคม พ.ศ. 2558

Arduino note 23/3/15 Distance Sensor

Arduino note: Distance Sensor 

                       Distance sensorคือเซ็นเซอร์ตรวจระยะทาง/ตำเเหน่งของสิ่งที่ตรวจจับได้ ซึ่งมีมากมายหลายประเภท และแต่ละประเภทมีหลักการแตกต่างกันดังนี้ 

1. Ultrasonic distance sensor

                   ultrasonic คือ คลื่นเสียงที่มีช่วงความถี่ที่สูงกว่า 20 kHz  ซึ่งคนเราไม่สามารถได้ยินเสียงในช่วงนี้ได้ 
                    Ultrasonic sensor คือ Sensor ที่ใช้หลักการปล่อยคลื่นเสียงultrasonicออกไปและรอรับสัญญาณกลับมา ส่วนใหญ่คลื่นเสียงที่ใช้อยู่ในช่วง 40 kHz 
Ability: -สามารถตรวจจับobjectโดยใช้คลื่นเสียง
              -มีระยะในการตรวจจับสูง
              -สามารถตรวจจับobjectได้โดยไม่ต้องสนใจเรื่องเเสงและสีรบกวน
              -สิ่งที่ตรวจจับได้มีทั้งลักษณะเป็นทั้งSolid Liquid ทั้งแบบเปียกและแห้ง
              -ตรวจจับไอฝุ่นได้ด้วยเช่นกัน
How it work : 

                       จากรูปตอนแรกTransmiter ที่เป้นSourceของเสียงultrasonic จะปล่อยคลื่อนออกไป เมื่อคลื่นถูกส่งออกมาและกระทบกับobjectด้วยสมบัติของคลื่น จะเกิดการสะท้อนออกมาเป็นคลื่นย้อนกลับ  คลื่นultrasonicที่ย้อนกลับมาจะโดนReceiverตรวจจับได้ในที่สุด

เมื่อเราดูจากหลักการแล้วทำให้รู้ว่า Ultrasonic sensorจะสามารถตรวจจับได้2แบบ คือ
                            1.ตรวจจับการมีวัตถุ
                            2.ตรวจจับระยะทางของวัตถุ (ใช้เวลาที่รอจนกว่าคลื่นจะกลับมา ในการคำนวณระยะ)                    
 ข้อจำกัด: -ไม่สามารตั้งในที่แคบได้ ในที่ๆไม่มีตัวกลาง(อากาศ เป็นต้น) หรือเป็นพื้นที่สุญญกาศก็ไม่                          สามารถใช้ได้เช่นกัน
                   - การติดตั้งsensorตัวนี้ใกล้ๅกันทำให้เกิดคลื่นรบกวน อาจทำให้ผิดพลาดได้
                   - วัสดุที่นุ่ม(ดูดซับเสียงเข้าไปได้ดี)จะทำให้การตรวจจับเป้นไปได้ยาก


2.Photo Electronic Sensor (Laser sensor)

                   เป็นSensorที่ใช้ตรวจจับวัตถุโดยอาศัยหลักการในการวัดปริมาณความเข้มแสงที่กระทบวัตถุและสะท้อนกลับมายังsensor สามารถแบ่งได้เป็น3ประเภท
        1.Through-beam sensor 
                     มีความสาามารถในการตรวจวัตถุที่มีระยะไกล มีความแม่นยำสูงมาก แต่ไม่สามารตรวจจับสีและวัสดุที่โปร่งแสงและโปร่งใสได้ การปรับแต่งค่อนข้างยากพอสมควร

        2.Retro-reflective sensor 
                      sensor ตัวนี้ลักษณะคือจะมีตัวยิงแสง และมีแผ่นสะท้อนเป็นตัวรับ-ส่งค่า ใช้พื้นที่ในการติดตั้งน้อยมาก แต่ความแม่นยำในการตรวจจับน้อยกว่าแบบแรก

         3.Diffuse-reflective sensor
                       Sensor ตัวนี้มีตัวรับและส่งอยู่ในตัวเดียวกัน ทำให้ระยะการตรวจจับน้อย และในการตรวจจับจะมีเรื่องสีเป็นสิ่งที่เกี่ยวข้องด้วย

3.Proximity Sensor 

                  เป็นSensorที่ตรวจจับวัตถุ โดยใช้หลักการของการเหนี่ยวนำและไฟฟ้าสถิตย์ มีความสามารถในการตรวจจับประเภทของวัตถุได้ มีความแม่นยำสูง ตอบสนองได้อย่างรวดเร็ว ระยะในการตรวจจับอยู่ใน 4-40mm และเนื่องจากใช้หลักการของคลื่นแม่เหล็กไฟฟ้าทำให้สภาพอากาศ หรือสภาพแวดล้อมที่แปรเปลี่ยนทางด้านแสง และเสียงก็สามารถทำงานได้อย่างปกติ
แบ่งได้เป้น2ประเภท
1. Inductive sensor
                   เป็นsensorที่ใช้หลักการในการเปลี่ยนค่าของการเหนี่ยวนำทางไฟฟ้า ที่ปล่อยออกมาจากขดลวดภายในsensor ซึ่งจะมีผลเฉพาะกับโลหะเท่านั้น 

2.Capacitive sensor
                   เป็นsensorที่ใช้หลักการทำงานที่คล้ายกับแบบแรก คือการเหนี่ยวนทางไฟฟ้า แต่ต่างกันที่ตัวตรวจจับ ซึ่งใช้หลักการของการเปลี่ยนแปลงค่าCapacitive จะสร้างสนามไฟฟ้าสถิตย์(electrostatic) ทำให้สามารถตรวจจับทั้งโลหะและ อโลหะได้ ซึ่งเป็นข้อได้เปรียบของsensorชนิดนี้

4.Limit Switch

                    เป็นsensorที่อาศัยหลักการตรวจจับทางmechanic คือจะส่งค่าก็ต่อเมื่อมีแรงภายนอกมากระทำ กด-แตะswitch ซึ่งสามารถติดตั้งได้ง่าย ความแม่นยำสูง ราคาถูก แต่มีอายุการใช้งานต่ำ และความเร็วในการตรวจจับอยู่ประมาณที่1.5 m/s ถือว่าช้ามากในการตรวจจับ


5.Infrared sensor


               เป็นอุปกรณ์ที่ตรวจจับคลื่นรังสี Infrared โดยมี Pyro Electric ซึ่งจะเปลี่ยนพลังงานความร้อนนี้เป็นพลังงานไฟฟ้าได้เป็นสัญญาณ Output ออกมา

แบ่งได้2อันคือ แบบตรวจจับความร้อนจากคลื่นInfrared และแบบที่ตรวจจับแสง Infrared ที่พบบ่อยในRemote TVหรือวิทยุในรถ เป็นต้น


Arduino note 20/3/15 : MIDI

Arduino note : MIDI 

                  MIDI หรือ Musical Instrument Digital Interface คือมาตรฐานการเชื่อมต่อของเครื่องดนตรีด้วยDigital System เช่นการเชื่อมต่อของ เครื่องดนตรี-เครื่องดนตรี ,เครื่องดนตรี-คอมมพิวเตอร์ เป็นต้น
ส่วนใหญ่เป็นข้อมูลคำสั่งที่เป็นเสียงแทนของเครื่องดนตรีชนิดต่างๆ(noteเพลงในรูปของตัวเลขหรือคำสั่ง)
                  MIDI นั้นมีความต่างจากDigital Audioตรงที่ลักษณะและขนาดของข้อมูล ซึ่งMIDIมีลักษณะข้อมูลเป็นคำสั่งดังนั้นเมื่อเทียบกับไฟล์Digital Audio แล้วขนาดของMIDIจึงเล็กมากเทียบแล้วกว่า 100เท่าตัว 
     

MIDI Message  

         เป็นข้อมูลคำสั่งที่ใช้ในการส่งแต่ละครั้ง ซึ่งจะ 1 Message จะส่งข้อมูลทั้งหมด 3 Bytes ซึ่งหากใช้การส่งด้วย micro controller Arduino จะมีการส่งข้อมูลได้ทีละ10 Bits และแยก10 Bits ได้อีกเป็น3ส่วนคือ Start bit , Stop bit  และ Data อีก8 bits 

ตัวอย่างMIDI Message 


                  จากตารางสังเกตุช่อง 1st Byte: 1001คือคำสั่งให้เล่นโน้ต nnnnบอกch.ที่เล่น เราเรียกพวกนี้                                                                        ว่าStatus Byte ส่วนnnnn คือตัวเลขที่กำหนด Chanel นั้นๆ
                                                    2nd Byte : 0คือตัวบ่งบอกว่าเป็นDataส่วนkkkkkkkคือตัวเลขที่เอาไว้                                                                           กำหนดระดับความถี่ของเสียงหรือก็คือเสียงโน้ตที่จะเล่น                                                                           ออกมาเป็นkeyไหนๆ สามารถเปลี่ยนได้ทั้งหมด128โน้ต
                                                    3rd Byte :  0คือตัวบ่งบอกว่าเป็นData และ vvvvvvv คือส่วนที่ไว้                                                                                 กำหนดค่าความดังของเสียงที่ออกมานั่นเอง สามารถปรับ                                                                         ได้128 level เช่นกัน

                ซึ่งนอกจากMessageเบื้องต้นเหล่านี้แล้วยังมีคำสั่งอีกมากมาย เช่นการเปลี่ยนชนิดเครื่องดนตรี หรือที่เรียกว่า Program Change Message ก็จะมีลักษณะของรูปแบบไม่เหมือนกัน

จากตารางสังเกตุช่อง 1st Byte: 1100คือคำสั่งให้เปลี่ยนเครื่องดนตรี(program change)  nnnnคือchanelที่                                                    ให้เปลี่ยนเสียง
                                   2nd Byte: 0คือตัวบอกว่าเป็นข้อมูลส่วน ppppppp คือnumberของเครื่องดนตรี                                                           แต่ละชนิดที่ใช้เปลี่ยนได้ มีทั้งหมด128ชนิดที่ให้เปลี่ยนได้ (สามารถ                                                         ดูnumber #PCได้ตามนี้  number #PC  )
                                    3rd Byte :ไม่มีคำสั่งใดๆ เนื่องจากการเปลี่ยนชนิดเครื่องดนตรี (program change                                                       ใช้แค่ 2 Byte เท่านั้น 

คำสั่งในการควบคุม MIDI เพิ่มเติมผ่านMIDI Message ตามLinkนี้ : MIDI Message table

MIDI Cable 

                   คือ สายที่ใช้เชื่อมต่อเพื่อรับ-ส่ง MIDI Message โดยแบบที่เห็นทั่วไปจะแยกได้5สาย ดังรูปหัวjackของMIDI ดังต่อไปนี้


MIDI controller by Arduino 

                      ในการควบคุม MIDI เราสามารถส่งค่าผ่านSerialได้เลย โดยการสั่งให้เล่นnoteๅตัวจะคำสั่งเป้นข้อมูลไปทีละ10 bits ทั้งหมด 3 ครั้ง รวม 3 Bytes 
                      การส่งMIDI Message เราจะส่งเรียงกันไปโดย ส่งส่วนของStatus Byteก่อน จากนั้นส่งส่วนของ1st Data Byte และ2nd Data Byte
Example : byArduino midi.cc





วันศุกร์ที่ 20 มีนาคม พ.ศ. 2558

Aeduino note 17/3/15

Aeduino note 17/3/15

                   สิ่งที่ได้รู้: เรียนรู้เรื่องของSerial communication การติดต่อระหว่างบอร์ดกับคอมพิวเตอร์
                                    -ความสำคัญของ baud rate หรืออัตราการรับ-ส่งข้อมูล ซึ่งหากอัตราการรับส่งที่ตั้งไว้ของคอมกับบอร์ดไม่เท่ากันข้อมมูลลที่ส่งไปมาจะไม่สาารถประมาวลผลได้
                                    -ความหมายของคำสั่งต่างๆ  
                                     begin(...) เป็นคำสั่งประกศเริ่มต้นการใช้งานSerial โดยในช่องเราต้องใส่                                       ค่าอัตราการรับส่งข้อมูลเพื่อsetค่าให้ตรงกับ computer  
                                     print(...) และ println(...) เป็นคำสั่งให้Serial ทำการพิมพ์ข้อมูลส่งกลับเข้ามาหา                            เรา ซึ่งทั้งสองคำสั่งมีส่วนต่างกันคือ print()จะไม่เว้นบรรทัดให้เรา ส่วน println()จะเว้น                            บรทัดให้             
                                     read(...)เป็นการให้บอร์ดอ่านค่าที่เราส่งเข้าไปให้เพื่อใช้ในการประมวลผลต่อไป
                                     available()เป็นคำสั่งที่ให้นับข้อมูลที่Serialเก็บอยู่ทั้งหมด

Exercise from P'ไทร

                  Ex1. สร้าง digit ที่เเสดงผลเมื่อเรากดตัวเลขส่งค่าจากคอมไปบอร์ด เช่น กดเลข1บนคีย์บอร์ด ได้displayเลขหนึ่งบน7segment 
                   Ex2.1 เมื่อใส่ค่า2ค่า คือหลักและตัวเลขให้แสดงผลตัวเลขในหลักๆนั้น เช่นกด'A1' displayที่ได้ออกมาจะขึ้นเลขหนึ่งในหลักแรก
                   Ex2.2 ใส่ค่า3ค่าเป็นตัวเลข ให้แสดงผลออกมาเป้นเลขที่เรียงกันตามหลัก เช่นกด'145' displayที่ออกมาจะได้เลข1เลข4และเลข5ตามลำดับหลัก
                   Ex3.ใส่ค่า3ค่าเป็นองศาที่ให้Servoหมุนไป เช่นเมื่อกด'227' Servoจะหมุนไปที่ตำแหน่ง227องศา

       Ex1.plan: 1. สร้างฟังก์ชั่นแสดงค่าpatternของตัวเลขขึ้นมา
                        2.กำหนดbaud rateเป็น9600ด้วย Serial.begin(9600);ในส่วนของvoid setup()
                        3.สร้างตัวแปรที่ใช้ในการเก็่าที่รับมาจากคอม inByte และสร้างตัวแปรที่ไว้บ่งบอกตัวเลขpatternของฟังก์ชั่น
                        4.เขียนคำสั่งinByte=Serial.read()ให้เก็บค่าเข้าไปในตัวแปรinByte และสั่งให้ส่งค่ากลับมาด้วยSerial.println() 
                        5.เนื่องจากตัวเลขที่เราพิมพ์ในคอมถูกส่งไปในรูปแบบเลขASCIIทำให้เราต้องเปลี่นแปลงค่า เช่นเมื่อเรากดเลข 1ลงไป บอร์ดจะได้รับค่า49เข้ามา ดังนั้นเราจึงสั่งให้ pattern = inByte-48 ;เพื่อให้เหลือค่า 1 จริงๆ 
                         6.เรียกใช้ฟังก์ชั่นpatternของตัวเลขโดยให้เอาค่าตัวเลขของตัวแปรpatternเป็นตัวกำหนดเลือกpatternของตัวเลข number(pattern) ;
                         7.รันprogram และทดสอบ 


     Ex2.1plan : 1.สร้างฟังก์ชั่นpatternตัวเลขเช่นเดิม และสร้างฟังก์ชั่นที่กำหนดหลักอีกฟังก์ชั่นนึง
                       2.กำหนดค่าbaud rate
                       3.เนื่องจากมีค่าที่รับเข้า2ตัวให้เราสร้างตัวแปร inByte1 กับ inByte2 จากนั้นสร้างตัวแปรที่จะเป็นตัวเลขกำหนดpattern และหลักของตัวเลข pattern digits 
                       4.ในส่วนvoid loop() เราต้องสร้างเงื่อนไขให้เริ่มเก็บค่าได้เมื่อมีข้อมูลอยู่ในSerialแล้ว2ตัวด้วยคำสั่ง if(Serial.available()==2){}
                       5.สั่งให้อ่านและเก็บข้อมูลไว้ในตัวแปรแรกก่อน ซึง่ตัวแปรแรกจะเป็นตัวระบุหลัก ได้แก่ Aหลักร้อย  Bหลักสิบ  C หลักหน่วย  และABC มีค่าในเลขASCIIตั้งแต่97-99 ดังนั้นเราจึงสร้างเงื่อนไขก่อนะทำการเก็บตัวแปรบอกหลักว่า if(inByte1>=97&&inByte1<=99) จากนั้นสร้างคำสั่งให้นำค่าไปเก็บไว้ในตัวเเปรdigits= inByte1-96; 
                       6.ให้อ่านข้อมูลอีกครั้งและเก็บไว้ในตัวแปรinByte2 ตัวเเปรนี้จะมีค่าเป็นตัวเลขที่ใช้กำหนดpatternเช่นเดียวกับEx.1 ให้นำไปลบ48ก่อนเก็บไว้ในตัวแปรpatternเข่นเดิม
          pattern=(inByte2-48); 
                       7.จากนั้นเรียกใช้ฟังก์ชั่นทั้งสองตัวขึ้นมาและใส่ค่าpatternและdigitsเป็นตัวกำหนด 
                    number(pattern);
                    digitnum(digits );
                    delay(1000);
                        8.รันprogramส่งเข้าบอร์ดและตรวจสอบผล

Ex.2.2plan:    1.สร้างฟังก์ชั่นpatternตัวเลขเช่นเดิม และสร้างฟังก์ชั่นที่กำหนดหลักอีกฟังก์ชั่นนึง
                       2.กำหนดค่าbaud rate
                       3.เนื่องจากมีค่าที่รับเข้า3ตัวให้เราสร้างตัวแปร inByte1 inByte2  กับ inByte3จากนั้นสร้างตัวแปรที่จะเป็นตัวเลขกำหนดpatternทั้ง3หลัก ได้แก่ patterndig1 patterndig2 และpatterndig3
                       4.สร้างเงื่อนไขให้เริ่มทำงานได้เมื่อมีค่าในSerial3ค่าแล้วด้วยคำสั่ง  if(Serial.available()==3){}
                        5.สั่งให้อ่านค่าทีละตัวและเก็บใส่ตัวแปรทีละอันตามลำดับ
                        6.จากนั้นลบตัวแปรทุกตัวด้วย48เช่นเดิม
                        7.เรียกฟังก์ชั่นขึ้นมาโดยกำหนดให้แต่ละคร้งdelay 5 ms  และฟังก์ชั่นกำหยดหลักให้ใส่ค่าเรียงกันหลัก1 2 3ตามไปเลย
                                 number(patterndig1);
                                 digitnum(1);
                                 delay(5);
                                 number(patterndig2);
                                 digitnum(2);
                                 delay(5);
                                 number(patterndig3);
                                 digitnum(3);
                                 delay(5);

                           8.รันprogramและตรวจสอบผล

Ex3.plan: 1.เรียกlibary Servoมาก่อนด้วยคำสั่ง #include<servo.h>
                 2.สร้างตัวแปรposในการเก็บค่าตำแหน่งที่ให้Servoหมุนไป และสร้างตัวแปรที่ไว้เก็บค่าจากSerialเป็นหลักหน่วย สิบ ร้อย =>int digit ,tens,hundreds;
                 3.ตั้งชื่อServoเพื่อเรีกใช้ด้วย =>Servo myservo;
                 4.กำหนดค่าbaud rate 
                 5.เชื่อมชื่อของservoและขาที่ต่อservoเข้าดว้ยคำสั่ง   myservo.attach(A5);
                 6.สร้างเงื่อนไขให้เริ่มทำงานได้เมื่อมีค่าในSerial3ค่าแล้วด้วยคำสั่ง  if(Serial.available()==3)
                 7.สั่งให้อ่านค่าทีละตัวและเก็บใส่ตัวแปรทีละอันตามลำดับ โดยค่าเเรกเก็บไว้ในตัวแปรhundredsและx100เข้าไปในหลักด้วย ค่าที่สองเก็บในtensและคูณ10เข้า และค่าที่สามเก็บในdigit
                 8.นำค่าทั้ง3หลักมาบวกกันและเก็บในตัวแปรpos ด้วยคำสั่ง pos=hundreds+tens+digit;
                 7.ป้อนคำสั่งให้Servoหมุนไปตามตำแหน่งด้วยคำสั่ง myservo.write(pos); 
                 9.ทดสอบprogram ตรวจผล 


วันจันทร์ที่ 16 มีนาคม พ.ศ. 2558

Arduino countdown 7Segment

Arduino countdown 7Segment 

              หลังจากที่ได้คำแนะนำจากพี่ไทร และลองเปิดอ่านจากTextเพิ่มเติมดูแล้วก้ได้ลองมาออกแบโปรแกรมนับถอยหลัง 100 sec (99-00)

Plan&Do:

  เนื่องจากการที่เราจะสั่งให้เลขทั้งสองหลัปรากฏขึ้นมาพร้อมกันเป้นคนลตัวเลขได้นั้นทำได้ค่อนข้างยาก(อาจะทำได้แต่ผมไม่รู้วิธีในแบบนี้) ผมจึงลองใช้โจทย์จากอันที่แล้วใน Arduino note 13/3/15 ที่ทำให้ไฟกระพริบด้วยความถี่ที่เร็วขึ้นจนเรามองเห็นว่ามันแสดงผลพร้อมกัน โดยผมกำหนดให้ความถี่ในการกระพริบในdelay() มีค่า 5 ms ทั้งหลักหน่วยและหลักสิบ จากนั้นสร้างfor ครอบัวเลขสองหลักสั่งให้ลูป100ครั้ง ดั้งนั้นตอนนี้เราจะได้เลขสองหลักที่ทำงานแสดงผล 1 second
 เช่น

 for(int i=0;i<100;i++)
  {
 
    digitalWrite(a, 0);
    digitalWrite(b, 0);
    digitalWrite(c, 0);
    digitalWrite(d,0);
    digitalWrite(e, 1);
    digitalWrite(f, 1);
    digitalWrite(g,0);
    digitalWrite(h, 0);
    digitalWrite(5,1);
    digitalWrite(4,1);
    digitalWrite(A2,0);
       delay(5);
    digitalWrite(a, 1);
    digitalWrite(b, 1);
    digitalWrite(c, 1);
    digitalWrite(d,1);
    digitalWrite(e, 1);
    digitalWrite(f, 1);
    digitalWrite(g,0);
    digitalWrite(h, 0);
    digitalWrite(5,1);
    digitalWrite(4,0);
    digitalWrite(A2,1);
       delay(5);
}
 เมื่อcomplied ก็จมีเลขแสดงผลเป็น 1กับ 0นาน1วินาที [( 5 ms + 5 ms ) x 100 round = 1000 ms = 1 s]
              และเมื่อผมลองทำเล่นๆไปได้10จำนวน ก็พบกับปัญหาคือcodeมีขนาดใหญ่มาก ข้อมูลติดกันเป็นพืดๆ  ผมจึงลองเขียนfunctionขึ้นมาๅอันเป้นแบบนี้
void number(int n)
{
  switch(n)
  {
  case 0:
    digitalWrite(a, 1);
    digitalWrite(b, 1);
    digitalWrite(c, 1);
    digitalWrite(d,1);
    digitalWrite(e, 1);
    digitalWrite(f, 1);
    digitalWrite(g,0);
    digitalWrite(h, 0);
    break;
  case 1:
    digitalWrite(a, 0);
    digitalWrite(b, 0);
    digitalWrite(c, 0);
    digitalWrite(d,0);
    digitalWrite(e, 1);
    digitalWrite(f, 1);
    digitalWrite(g,0);
    digitalWrite(h, 0);
    break;
  case 2:
    digitalWrite(a, 1);
    digitalWrite(b, 1);
    digitalWrite(c, 0);
    digitalWrite(d,1);
    digitalWrite(e, 1);
    digitalWrite(f, 0);
    digitalWrite(g,1);
    digitalWrite(h, 0);
    break;
  case 3:
    digitalWrite(a, 1);
    digitalWrite(b, 0);
    digitalWrite(c, 0);
    digitalWrite(d,1);
    digitalWrite(e, 1);
    digitalWrite(f, 1);
    digitalWrite(g,1);
    digitalWrite(h, 0);
    break;
.
.
.
,
   }

   และเมื่อลองเรียกใช้ก็สามารถทำงานได้เช่นกัน ซึ่งในการเรียกใช้functionตัวนี้ต้อง เขียนด้วย

number(จำนวนที่ต้องการให้ปรากฏในSegmentนั้นๆ);
สมติว่าประกาศ
 number(3);

เมื่อรันดปรแกรมส่วนที่นำมาใช้แทนจริงๆคือ
case 3:
    digitalWrite(a, 1);
    digitalWrite(b, 0);
    digitalWrite(c, 0);
    digitalWrite(d,1);
    digitalWrite(e, 1);
    digitalWrite(f, 1);
    digitalWrite(g,1);
    digitalWrite(h, 0);
    break;
   หลังจากเขียนfunction number();เสร้จผมก้ลองร่างๆดูว่าจำนวน99-00 มีdisplayที่แสดงออกมาเป้นอะไรบ้าง  และเริ่มวาดส่วนประกอบต่างๆของโปรแกรม ในกระดาษทด จากนั้นก็ลองพิมพ์ที่คิดไว้ออกมาเป็นcodeจริงๆ


     อธิบาย: 1.สร้างfunction number(); ซึ่งใช้ให้เป็นแสดงค่าเลขdisplayของSegment โดยฟังก์ชั่นจะทำงานก็ต่อเมื่อมีค่ารับเข้ามา และนำค่านั้นไปเลือกแสดงผลของ switch case ดังรูป
                   2.สร้างfunction digit(); และ tens();ไว้เป็นตัวกำหนดหลักของSegment
                   3. ในส่วน void setup() ให้กำหนดค่าpinของ7Segmentลงไป(อย่าลืมใส่ค่าpinของหลักsegmentด้วย)
                   4.ต่อมาในส่วนvoid loop() ให้สร้างloop ใหญ่ที่ใช้เป็นตัวกำหนดค่า99-00 ด้วยfor(int k=99;k>=0;k--)
                   5.checkค่าkด้วยif และกำหนดเงื่อนไขว่าถ้าk<10 จริงให้เลขฝั่งซ้ายเป้น0และเลขฝั่งขวาเท่ากับkเลย =>  if(k<10)
                        {
                           right=0;
                           left=k;
                         }
                      6.กำหนดเงื่อนไขที่ k เป็นอย่างอื่นและเป็นจริงให้เลขฝั่งซ้ายหารเอาเศษ และเลขฝั่งขวาหารเอาจำนวนเต็ม => else
                                   {
                                     right=k%10;  //การหารเอาเศษ modulo
                                     left=k/10;
                                    }
                    7.สร้างloopที่ใช้แสดงผลตัวเลข 99-00 โดยการนำเอาตัวแปร left และ rightแทนใน function ของ number();โดย ใช้คำสั่ง
                                     for(int i=0;i<100;i++)
                                      {
                                         number(left);
                                         tens();
                                         number(right);
                                         digit();
                                       }
                       8.complied  program และตรวจสอบdisplay ว่าได้ตามที่โจทย์ต้องการมั้ย?

วันอาทิตย์ที่ 15 มีนาคม พ.ศ. 2558

Arduino note 13/3/15 Servo Controller & 7 Segment Tip from P'Sai

Arduino note 13/3/15

Servo Controller

              สิ่งที่ได้  - ได้ปรับความเข้าใจเกี่ยวกับความรู้เรื่อง Servo motorกับพี่ไทร
                                        ได้รู้เพิ่มเติมว่าservo motorนั้นมีคุณสมบัติที่สำคัญคือ นอกจากServo motor จะสมารถควบคุมPositionแล้วยังสามารถรักษาตำแหน่งเดิมของมันได้อีกด้วย เช่น เม่ือเราสั่งให้servo motor หมุนไปที่60องศา จากนั้นเราใส่แรงภายนอกผลักmotorให้หมุนไปทางอื่นservo motorจะพยายามที่จะคงตำแหน่งเดิมไว้ไม่ว่าเราจะผลัก จะเลื่อนไปตำแหน่งใดก็ตาม
                                        และยังได้รู้จักกับRC Servo motor หรือservo motorที่ควบคุมด้วยสัญญาณวิทยุ (Radio Controller) โดยการควบคุมนั้นจะใช้สัญญาณPulse(พัลส์) เป้นตัวควบคุมโดยซึ่งมีความกว้าง1-2 milliseconds (ms)
                    RC Servo นั้นมีสายสามเส้นเช่นเดียวกับServoทั่วไปคือ 1.สายไฟ(VDD) 2.สายกราวด์(GND) 3.สายData(สายสัญญาณ)    
                    torque และรอบของServo นันมีความสัมพันธ์กับความต่างศักย์ไฟฟ้า ซึ่งในServoส่วนมากสามารถรับไฟในช่วง4.8-6.0 volt ได้ โดยรอบและtorque จะเพิ่มขึ้นเมื่อเราจ่ายกระแสไฟเข้าไปมาก
Servoจะทำงานได้ก็ต่อเมื่อมีไฟเลี้ยงพอแต่หาก ไฟน้อยหรือมากกว่าที่กำหนดไว้Servoก็จะไม่ทำงานหรืออาจชำรุดเสียหายได้

                     -ได้ทดสอบนำcodeจากSimulatorมาต่อวงจรเข้ากับboardและสั่งควบคุมPosition ของServo motorให้ได้ตามที่codingไว้  ผลที่ได้พบว่าServoสามารถทำงานได้จริงดังคลิปที่ถ่ายไว้          

                         ซึ่งนอกจากนี้พี่ไทรยังแนะนำให้ผมรู้จักกับfunction ที่มีชื่อว่าmap(value,fromLow,
fromHigh,toLow,toHigh); ซึ่งป็นfunctionที่เกี่ยวกับบัญญัติไตรยางค์ การเทียบค่าหนึ่งไปสู่ค่าหนึ่ง 
                        โดยก่อนหน้านี้ในตอนแรกที่ผมcodingจากSimulatorนั้น ผมเทียบออกมาก่อนแล้วค่อยใช้ตัวรทอนเอา ซึ่งเมื่อได้ลองเอาmap(); มาใช้ผมก็รู้ว่ามันมีประโยชน์มาก
                       หลังจากนั้นผมลองหาข้อมูลเกี่ยวกับPulseได้พบว่าเราสามารถกำหนดค่าความกว้างของ คาบ(T) ในสัญญาณPulseได้ โดยความกว้างของคาบนั้นจะเกี่ยวข้องโดยตรงกับPositionของServoโดยตรงจากรูป

        ทำให้เราจะสามารถเขียนcodeในการควควมServoได้โดยการกำหนดช่วงคาบที่แทนด้วยเวลาเป้นMicro Second (us) โดยคำสั่งที่ใช้คือ myservo.writeMicrosecounds(time); ในวงเล็บจะเป้นค่าที่เราไว้ใช้กำหนดคาบของPulseในหน่วยusตามที่กล่าวข้างต้น 


7 Segment Tip from P'Sai

           จากปัญหาที่ได้noteไว้ใน  'Arduino note 9/3/15'   ที่บอกไว้ว่าไม่รู้เกี่ยวกับpinไหนเป็นอันไหนของ7Segment วันนี้พี่ไทรก้ได้มาบอกเพิ่มเติม : คือปกติในตัววงจร7Segmentนั้นจะใช้คำสังในการสั่ง8บรรทัด(line 7 pin + dot 1 pin) แต่ในboard FunBasic I/O เราสามารถกำหนดให้เปิดปิดเลขในหลักใดๆได้ โดยใช้logic 0 ในการเปิดเลขหลักนัันๆ และlogic 1 ในการปิดเลขหลักนั้นๆในบรรทัดต่อไปได้เลย เช่นสมติว่าเราต้องการให้เลขหนึ่งปรากฏในหลักA2 D4 เป้นต้นจะได้ว่า
void loop(){
 digitalWrite(a, 0);
 digitalWrite(b, 0);
 digitalWrite(c, 0);
 digitalWrite(d,0);
 digitalWrite(e, 1);
 digitalWrite(f, 1);
 digitalWrite(g,0);
 digitalWrite(13, 0);
 digitalWrite(A2.0);
 digitalWrite(D4.0);
 digitalWrite(D5,1); 
   delay(1000);
}
           ซึ่งพี่ไทรก้ได้ให้โจทย์มาว่าเปิดไฟในเลข1 หลักA2 เลข2หลักD4 และเลข3ในหลักD5 โดยให้ตัวเลขวิ่งสลับเปิดปิดกันไปมาเรียงลำดับ และเมื่อเพิ่มค่าใน Potentiometer และไฟจะวิ่งด้วยตวามถี่มากขึ้นเรื่อยๆ จนเมื่อถึงค่าๆหนึง ไฟทั้ง3จะวิ่งด้วยความถี่ที่เร็วจนเรามาองเห็นว่าทั้ง3ตัวเลขติดพร้อมกัน 
          Plan: 1.สร้างตัวเเปรvalueที่ใช้เก็บค่าที่รับจาก potentiometer
                   2.ในส่วนของvoid setup() ให้กำหนดค่าความเร้วในการรับข้อมุลเข้าด้วยคำสั่งSerial.begin(9600); กำหนดpinที่ใช้ของตัวหลอดไฟ *อย่าลืมกำหนดpinของหลักตัวเลข A2 D4 และD5 ด้วย*  
                   3.ให้รับค่าจากpotentiometerเข้าไปเก็บในตัวเเปรvalue โดยใช้คำสั่งvalue=analogRead(pot entiometer);
                   4.จากนั้นให้ปริ้นค่าที่รับในSerial monitor => Serial.println(value);
                   5.สั่งตัวเลขในแต่ละหลักตามที่ต้องการ และใส่ค่าหน่วงเวลาเป้นนานเท่าvalue =>delay(va lue);
                   6.complies โปรแกรมใส่boardและลองปรับค่า เช็คว่าได้ตามที่codingไว้หรือไม่? 

หลังจากที่ทำการทดสอบพบว่าเมื่อcompliesเสร็จและลองปรับค่าพบว่าไฟสามารถวิ่งมีความถี่จนเรามองเห็นทั้ง3ตัวเลขพร้อมกัน แต่เมื่อเราหมุนค่าpotentiometerไปต่ำสุด(ต่ำกว่าประมาณ15เช็คจากSerial monitor) ไฟจะเกิดbug เห็นเลข3ในหลักสุดท้ายค่าเดียว ส่วนหลักอื่นๆ ค่าไม่ชัดเจนดังคลิปต่อไปนี้



วันพฤหัสบดีที่ 12 มีนาคม พ.ศ. 2558

Arduino note 12/3/15

Arduino  note 12/3/15
        สิ่งที่ได้: -ศึกษาเกี่ยวกับการควบคุม Servo motorเกี่ยวกับ Position Control  โดยก่อนที่เราจะใช้คำสั่งในการควบคุมServo motorได้เราต้องดึงข้อมูลคำสั่งจากlibrary มาก่อน  => #include<Servo.h>
จากนั้นก็สร้างชื่อของอุปกรณืๅที่จะสั่งด้วย => servo ชื่อตัวที่จะสั่ง  ; เช่น servo myservo;
      และในส่วนของvoid setup() เราจะใช้คำสั่ง=> myservo.attrach(pin);    ในการกำหนดช่องpinที่สายข้อมูลของServo motorต่ออยู่
      ต่อมาในส่วนของคำสั่งหรือในส่วนvoid loop() เราสามารใช้คำสั่ง myservo.write(angle); ในการควบคุมangle(มุม) ที่้องการให้Servomotor หมุน/หันไปนั่นเอง
 

สิ่งที่อยากทำ ; ควบคุมมุมของServo motorด้วยLDR หรือ Potentiometer
        Plan:  ลำดับงาน: ดึงข้อมูลคำสั่งservo>สร้างตัวแปรที่ใช้เก็บค่าของมุมservo ,ตัแปรที่ใช้เก็บค่าจากsensor,ตัวแปรที่ใช้ในการทอน(หาร)ค่าของตัสแปรที่เก็บจากsensor>กำหนดความเร็วในการรับค่าของsensor>กำหนดตัวแปรรับค่าเข้ามา>จากนั้นนำค่าที่เก็บมาทอนกันก่อน>นำค่าที่หารกันเสร็จแล้วไปใส่ในวงเล็บในคำสั่งเปลี่ยนมุมของservo
      อธิบายหลักการทำงานตามลำดับงาน
           1.ดึงข้อมูลคำสั่งของservoด้วย #include<Servo.h>  และสร้างชื่อมอเตอร์ที่จะสั่งมาด้วย servo myservo;
           2.สร้างตัวแปร pos (position)แบบเก้บทศนิยมและกำหนดค่าให้เป็นศูนย์  ด้วยdouble pos=0; จากนั้นสร้างตัวแปรvaleในการเก้บค่าจากsensor ,สร้างตัวแปรdivisorไว้ใช้ทอนตัวแปรvalue โดยตัวแปรนี้ตอนกำหนดค่าต้องหารจำนวนที่มากที่สุดจากSensorแล้วมีค่าน้อยกว่าเท่ากับ180
           3.กำหนดความเร้วในการรับค่าของSensorด้วย Serial.begin(9600);
           4.กำหนดให้ตัวแปรvalueรับค่าจากSensor ด้วย Serial.println(value);
           5.นำค่าตัวแปรvalueมาทอนด้วยตัวแปรdivisor ด้วยคำสั่ง value/=divisor;จากนั้นนำค่าของตัวแปรvalueไปใส่ในตัวแปรpos => pos=value;
           6.ป้อนคำสั่งการหมุนองศาmotorดดยกำหนดตำแหน่งที่จะไปในตัวแปรvalue
       ด้วยคำสั่ง myservo.write(pos);
           7.test ดูว่า servo motorสามารถหมุนตามที่programingได้หรือไม่


ทดลองcoding ใน simulator

http://123d.circuits.io/circuits/642072-servo-motor-with-ldr-or-potentiometer

หลังจากทำการทดลองในsimulatorเสร้จสิ้นพบว่า
        Servo motor สามารถทำงานและควบคุมangleโดยใช้LDR และ Potentiometer ได้ แต่พบปัญหาว่าเมื่อค่าที่รับจากsensorมีขนาดน้อยลงเรื่อยๆทำให้มุมของservoในช่วงสุดท้ายขยับเข้ามาไม่สุด(เล็กน้อยมากกๆ)  จึงมำให้servo motorหมุนไม่ครบ180องศา

วันพุธที่ 11 มีนาคม พ.ศ. 2558

Arduino Note 11/3/15

Arduino Note 11/3/15
                 

จากการอ่านเรื่องmotorสรุปได้ว่า

        Motor คือ อุปกรณ์ไฟฟ้าที่เปลี่ยนฟลังงงานไฟฟ้าเป้นพลังงานกล มีหลักการทำงานคือการใช้ขดลวดเหนี่ยวนำทำให้เกิดสนามแม่เหล็กไฟฟ้าขึ้น และเกิดแรกผลัก-ดูด ของสนามแม่เหล้ก ซึ่งเราสามารถสร้างรูปแบบของแรงที่เกิดจากmotorได้ออกมา2แบบคือ 1.Linear fore และ 2.Toque
        Motorมีมากมายหลายชนิด ส่วนใหญ่ที่เราเห็นและพบกันบ่อยๆจะเป้นmotorที่ให้รูปแบบแรงแบบtoque หรือแบบหมุนนั่นเอง เช่น พัดลม เครื่องดูดฝุ่น เครื่องปั่น-บด-ผสมอาหาร เป็นต้น
       แต่motorยังมีอีกมากมายหลายชนิดถ้าจำแนกตามประเภทไฟฟ้าที่จ่ายเข้าไปก้ได้2แบบ คือDC motor และ AC motor

DC motor คือ
          motorที่รับไฟฟ้ากระเเสตรง สามารถควบคุมความเร็วได้ง่าย และเมื่อต้องการสับเปลี่ยนทิศทางการหมุนสามารทำได้ง่ายๆโดยการสับเปลี่ยนขั้วไฟเท่านั้น การหมุนจะถูกสับเปลี่ยนทันที

AC motor คือ
          motorที่ใช้ไฟฟ้ากระแสสลับ เราแบ่งAC motorได้เป้น2แบบ Synchronous และAsynchronous 
            1.Asynchronous  มีความสามารในการสร้างspeedได้คงที่กว่าDC motor มีประสิทธิภาพที่สูงกว่า อีกทั้งยังราคาถูกกว่าด้วย แต่มีข้อจำกัดด้านการควบคุมระยะการหมุนที่แม่นยำ และในช่วงเริ่มต้นการทำงาน AC motorจะมีประสิทธิภาพต่ำ  สว่นใหญ่ใช้ในเครื่องใช้ไฟฟ้าในบ้าน (เครื่องมือที่ตั้งอยุ่กับที่ เช่นสว่านแท่นเป็นต้น)

     2.Synchronous เป้นAC motorที่มีประสิทธิภาพสูงความเร็วคงที่หรือปรับได้ มีเสียงรบกวนต่ำเช่นHysteresis motor

Motorแบบอื่นๆ
         
           servo motor =>คือmotorที่มีความสารมารถในการควบคุมความเร็วรอบและtorqueได้ มี

ทั้งแบบใช้ไฟกระแสตรง(DC) และไฟฟ้ากระแสสลับ(AC) 
            
            stepper motor=>คือmotorที่มีความแม่นยำในการหมุน โดยโรเตอร์ของแม่เหล็กจะ

ประกอบด้วยแม่เหล้กถาวร ซึ่งทำให้มันสามารหมุนได้อย่างเป้นstepคือ หมุนแล้วหยุด หมุนแล้ว

หยุด เราสามารถควบคุมมันได้ด้วยวงจรอิเล้กรอนิกส์ ซึ่งทำให้มันสามารถหมุนและเปลี่ยนทิศทาง

หรือหยุดพัก และหมุนต่อไปได้อย่างแม่นยำ นอกจากนี้ยังสามารถควบคุมแรงละรอบได้ด้วย ซึ่ง

ความสามารถเหล่านี้ของstepper motor ได้มาจากรูปแบบของservoนั่นเอง ใช้มากในเครืองจักที่

ต้องการความแม่นยำสูง เช่นCNC  , Hard disk เป็นต้น



วันจันทร์ที่ 9 มีนาคม พ.ศ. 2558

Arduino note 9/3/15



Arduino note 9/3/15
               
          สิ่งที่ได้วันนี้ -ลองเอาcode 7-segment มาใส่ในboardจริง พบปัญหาคือ
                         1.ไม่ทราบpinแต่ละอันของsegmentทำให้ต้องทดลองไล่ขาแต่ละอันไปเรื่อยๆจนครบ
                         2.แถบsegmentขึ้นพร้อมกันทั้ง2หลัก เมื่อรันโปรแกรม (ต้นเหตุเดียวกับข้อเเรก)
                            (ปล.วันนี้ไม่ได้ถ่ายวิดีโอไว้ ครั้งหน้าผมจะลงตามให้5555)

                         -เริ่มลองเขียนโค้ดการใช้LDR โดยวางแผนไว้2แบบคือ
                 แบบแรกให้ LDR รับค่าเข้ามา โดยกำหนดความเร็วในการรับข้อมูลเข้าด้วย Serial.begin(9600); และเก็บเข้าที่ตัวแปรvalue ด้วยSerial.println(value); จากนั้นให้ปรับค่าที่รับมาลดลง4เท่า โดยใช้ value/=4 และให้แสดงผลความสว่างของไฟoutput โดยใช้ ==>analogWrite(led,value);
                 แบบที่สอง ให้LDRรับค่าเข้ามาและเก็บที่ตัวแปรvalueด้วยวิธีเดียวกับแบบแรก และสร้างตัวเเปรbaseขึ้นมาเพื่อใช้เป็นเกณฑ์ในการตรวสอบค่าที่รับเข้า และสร้างเงื่อนไขแรก if(value<base){} และให้คำสั่ง digitalWrite(led,HIGH);
              delay(value);
              digitalWrite(led,LOW);
              delay(value);
ในวงเล็บเงื่อนไขของif ซึ่งผมได้ลองใช้หลอดไฟ3ดวงในการเช็คความถี่ เมื่อค่าที่รับมาเปลี่ยนไปเรื่อยๆ
และกำหนดเงื่อนไขที่อื่นๆที่มากกว่าเกณฑ์ของbase ด้วย else{} และให้คำสั่ง digitalWrite(led,HIGH);
ในวงเล็บเงื่อนไขกับหลอดLEDทั้ง3ดวงเพื่อเป็นตัวบอกว่า ในขณะนี้ค่าทีรับมามากกว่าเกณฑ์baseแล้ว

                  ซึ่งผลที่ออกมาพบว่าแผนที่วางไว้แบบแรกค่อนข้างไม่ตรงกับีท่คาดหวังมากเนื่องจากค่าขนาดใส่เข้าไปในanalogWriteใกล้กันมากผลที่สังเกตไฟได้จึงค่อนข้างแยกออกจากกันได้ยาก
                  ส่วนผลของแบบที่สองนั้นได้ผลออกมาตรงกับที่คาดไว้คือเมื่อลดความสว่างของแสง ไฟ3ดวงจะวิ่งด้วยความเร็วที่เพิ่มขึ้น และเมื่อให้แสงสว่างเต็มที่(ให้ความสว่างสูงกว่าเกณฑ์base) ไฟทั้งสามดวงจะสว่างพร้อมกัน
http://123d.circuits.io/circuits/635574-ldr-frequence-of-led


                   -เมือได้ทดลองในsimulatorเรียบร้อยแล้ว ผมจึงลองเอาcodeของแบบที่สองมาcompliedใส่กับบอร์ดจริงดู  ในตอนแรกพบว่าเกิดความผิดพลาดขึ้นคือไฟทั้ง3วิ่งช้าและเร็วสลับกันไปเอง และเมื่อเช็คค่าที่รับเข้ามาโดยSerial Monitorดุพบว่า ค่าที่รับเข้านั้นไม่คงที่และสลับมากน้อยไปเรื่อยๆ เมื่อลองถามพี่ๆในห้องดุพี่เค้าก็มาช่วยดู หลังจากเช็คได้ก็พบว่าผมใส่pinรับเข้าของsensorผิดตัว(ปัญหาคือboardบอกขาของLDRกับsensorวัดอุณหภูมิใกล้กัน เลยดูผิดนั้นเอง)
                   -เมื่อแก้ไขเสร็จแล้วพบว่าสามารถทำงานตามที่programได้จริงเหมือนกับที่ทดสอบในsimulatorเช่นกัน

                        -  Number base คืออะไร?
             ยกตัวอย่างเลขฐานสิบ==> คือเลขที่มีสัญลักษณ์แทนตัวเลขทั้งหมด10จำนวนคือ 0 1 2 3 4 5 6 7 8 9 ซึ่งเราใช้และพบเจอกันทุกๆวันนี้นั่นเอง
         เลขฐาน16 ก็จะเป็น  0 1 2 3 4 5 6 7 8 9 A B C D E F เช่นกัน
 ซึ่งเมื่อเลขฐานแทนสัญลักษณ์ในตัวที่มากที่สุดของเลขฐานนั้นแล้ว จะทำให้ขึ้นหลักใหม่ คือรีเซ็ตเลขในหลักแรกให้เป้นค่าที่น้อยที่สุดและเพิ่ม+1ค่าในหลักต่อไป
เช่น 1010  11102 เป็นต้น

การแปลงค่าเลขฐาน

แปลงฐาน16เป้นฐาน10
Ex.1
  1916 =(1x16^1)+(9x16^0)
         = (16)+(9) = 2510

Ex.2
A316  = (10x 16^1)+(3x16^0 )
         = 160+3 =16310
โดยเมื่อเรานำเลขฐานมาใช้กับการprogramming ส่วนใหญ่ภาษาคอมพิวเตอร์จะเป็นเลขฐานสอง ข้อมูลที่เป็นขาไฟที่จ่ายออก8ขาจะมีข้อมูล8บิต พอแปลงเป็นฐานสองจะได้เลขทั้งหมด8หลัก
เช่น
FF16 = 11111111
A116 = 10110001
เป้นต้น

วันอาทิตย์ที่ 8 มีนาคม พ.ศ. 2558

Arduino Note 8/3/15


Arduino Note 8/3/15
     
        สิ่งที่ได้ -นำความรู้เรื่องSegmentมาลองใช้กับ123D circuit
                    http://123d.circuits.io/circuits/633562-segment-roll-and-count


                    -โดยได้ลองวางpatternไว้2แบบคือ 1. roll patternในปุ่มแรก
                                                                            2.Count 1-9 patternในปุ่มที่สอง
                    -สงสัยว่าจะนำเรื่องเลขฐานมาใช้กับSegmentได้มัย? เนื่องจากโค้ดที่เขียนมีความยาวมากเลยทีเดียว
                    -ลองศึกษาเกี่ยวกับการใช้LDR sensor คร่าวๆ ได้รู้จักถึงความสำคัญและการนำไปใช้ง่ายๆ ซึ่งมีหลักการคือสารกึ่งตัวนำในLDRจะมีความสามารถในการต้านทานไฟลดลงเมื่อมีแสงสว่างมากขึ้น
ในบางครั้งก็นำมาใช้เป็นSensorตรวจจับวัตถุก็ได้

LED Run Arduino Note 6/3/15







Arduino Note 6/3/15
          สิ่งที่ได้ทำ -ทบทวนเลขฐาน 2,8,10,16
     

                            -ได้ลองCompiled Program ลฃใน Arduino UNO board (บอร์ดของจริงเลย!!!)
                            -coding programไฟวิ่ง 1.--->,<---- (8LED)
                                                                2.----><---,<-----> (8LED)
                             -จากโจทย์ข้อ2. ทำให้ได้ลองใช้switch case ครั้งแรก
                            -ได้ลองหาความรู้เพิ่มเติมเกี่ยวกับSegment(ไฟตัวเลข)