วันอาทิตย์ที่ 5 เมษายน พ.ศ. 2563

ลองแบบรวดเร็ว Bluephill STM32F103C8T6 boards ราคาเริ่มต้นหลักร้อยบาท

เริ่มต้นใช้งาน Bluephill STM32F103C8T6 boards ราคาเริ่มต้นหลักร้อยบาท ST-LINK V2 ผู้เขียนได้รวบรวมข้อมูลไว้นานมากแต่ยังไม่มีเวลานำเสนอการทำลองคอมไพล์และอัพโหลดเฟิร์มแวร์ลงตัวอุปกรณ์ สำหรับการทดลองในครั้งนี้

ประกอบไปด้วยอุปกรณ์ต่อไปนี้
  1. บอร์ด Bulephill STM32F103C8T6
  2. ST-LINK V2
  3. Arduino IDE 1.8.12
  4. STM32 ST-LINK Utility
  5. IDE online arm embed https://ide.mbed.com/


ขั้นตอนบอกเล่าเก้าสิบ สำหรับการทลลองในวันนี้จะเป็นการเริ่มต้นทบทวนก่อนโดยการคอมไพล์ LED BLINK บนเครื่องมือ Arduino ปกติบอร์ด Bluephill เองไม่สามารถอัพโหลดเฟิร์มแวร์ด้วยตัวเอง
ต้องอาศัยผ่านบอร์ด ST-LINK V2 สำหรับการไวร์สายจากอุปกรณ์ Bluephill กับ ST-LINK V2 ก็ทำตามคู่มือ การอัพโหลดจาก Arduino ไม่จำเป็นต้องสลับดิฟสวิทช์บนบอร์ด Bluephill ใด ๆ เพราะความเก่งของ บอร์ด ST-LINK V2


หลังจากทดลองเครื่องมือ Arduino สำเร็จไปแล้ว ขั้นตอนต่อไปจะเป็นการทดลองการในเครื่องมือ STM32 ST-LINK Utility สำหรับอัพโหลดเฟิร์มแวร์ รวมถึงทดลองการอัพโหลด USB bootloader ไปยังบอร์ด Bluephill ด้วย ผู้เขียนใช้โค๊ดที่ดาวน์โหลดมาจากเน็ต สามารถอัพโหลดใส่ Bluephill ได้ และ USB พอร์ตก็ทำงาน แต่ยังไม่สามารถอัพโหลดโปรแกรมผ่านผ่าน USB ของอุปกรณ์ Bluephill ได้ คงต้องมาว่ากันใหม่ในครั้งหน้า อาจจะต้องใช้การเขียนโปรแกรมแบบ Virtual USB มีการใช้สายเชื่อมต่อแบบ USB to Serial แทน





เรื่องสุดท้ายน่าทึ่งมากค้นพบโดยบังเอิญ os.embed.com การเช็คเอาท์โค๊ดตัวอย่างทดลองรีจิสเตอร์และคอมไพล์โค๊ดแบบออนไลน์ ได้ไบนารี่ไฟล์เอามาอัพโหลดใส่อุปกรณ์ Bluephill โดยใช้อุปกรณ์ STM32 ST-LINK Utility ทำให้สามารถพัฒนางานได้รวดเร็วยิ่งขึ้น ไม่ต้องเสียเวลาติดตั้งซอฟต์แวร์ใด ๆ เพิ่มเติม ผู้เขียนเองพยายามดาวน์โหลด  Ebed studio มาแล้วแต่ไม่สามารถคอมไพล์ผ่านเพราะต้องโหลดไลบราลี่ไม่สำเร็จ


สำหรับการเริ่มต้นการใช้งานในวันนี้คงเกริ่นคร่าว ๆ เพียงแค่นี้ก่อน เอาไว้กันลืมว่าเราได้ศึกษาไปถึงไหนแล้ว วันหน้าก็แค่กลับมาทบทวน ตอนนี้ผู้เขียนเองมีหลายโปรเจคที่สนใจ โดยเฉพาะการศึกษาอุปกรณ์ไมโครคอนโทรลเลอร์ Espressif อีกรุ่นหนึ่งซึ่งมีความสามารถในการทำงานแบบอุปกรณ์ IoT ที่ไม่ธรรมดา รวมถึงมีการนำไปประยุกต์ใช้งานในการควบคุมอุปกรณ์ที่จัดการทางด้านพลังงาน โซล่าเซลล์ รวมถึงรถยนต์ไฟฟ้า ที่กำลังโด่งดังมากในกลุ่มยุโรปที่เริ่มต้นโครงการนี้ จัดไปนวัตกรรมก้าวลำนำหน้าต้องนึกถึง ผู้จำหน่ายอุปกรณ์ GPS TRACKER ชั้นนำในประเทศไทยทีเดียว เจ้านี้ขอบอก

วันพุธที่ 5 มิถุนายน พ.ศ. 2562

เขียนโค๊ด PHP ง่าย ๆ สำหรับแปลงค่าจากพิกัดเป็นชื่อตำแหน่ง reversed geocoding โดยใช้ OpenStreetMap


เนื้อหาในวันนี้เป็นการเขียนโค๊ด PHP ง่าย ๆ สำหรับแปลงค่าจากพิกัดเป็นชื่อตำแหน่ง reversed geocoder โดยใช้ OpenStreetMap ขอบระบบ gps tracking ปัญหาที่ผู้เขียนพบเจอของการใช้การแปลงพิกัดโดยใช้ google map ก็คือจำกัดการค้นหาชื่อตำแหน่งมีค่าใช้จ่าย 5 USD ต่อ 1000 ครั้ง และต้องสมัครขอรับคีย์สำหรับการใช้งาน เพื่อให้การดำเนินการแปลงค่าจากพิกัดเป็นชื่อตำแหน่ง reversed geocoding ทำได้โดยใช้แผนที่โอเพนซอร์สได้เหมือนกัน


Input Agent (lat/lon)---|---   PHP reversegeocoder.php(get/post) ---|---  Output XML

รูปที่ 1 การทำงานของระบบ reverse geocoding

เมื่อมีการส่งค่าอินพุทตำแหน่ง ละติจูดและลองกิจูด ผ่านทางเวบบราวเซอร์หรือเอเจนท์เพื่อทำการเปิดไฟล์ reversegeocoder.php จากนั้นโปรแกรม reversegeocoder.php  จะส่งค่าพิกัดดังกล่าวไปค้นหาชื่อตำแหน่งจาก OpenStreetMap เมื่อได้ค่าตำแหน่งมาแล้วก็แสดงผลเป็นแบบ XML จากตัวอย่างโค๊ดนี้จะใช้จุดเด่นของฟังก์ชั่น file_get_contents ของ PHP ที่จะอ่านค่าจะต้นทางเปลี่ยนเป็นสตริงค์

ทดสอบการทำงานสคริปออนไลน์

http://www.thaimdvr.com/geocoder.php?longitude=100.478607&latitude=13.887050
 
ลองหรือยังแต่ที่ผู้เขียนทดลองใช้งานมาครบปี มันก็ไม่เคยมีปัญหาใดๆ ใช้งานจริงได้ดั่งใจ ระบบ GPS TRACKING ที่ดีมีมาตรฐาน รู้ลึกรู้จริงเรื่องอุปกรณ์ และงานบริการหลังการงาน แวะไปเยี่ยมชมเวบไซต์จีพีเอสไทยได้ 
 

   <?php
 // get op, longitude and latitude from the method get/post url
  $op        = isset($_GET['op']) ? $_GET['op'] : 0;
  $lon       = isset($_GET['longitude']) ? $_GET['longitude'] : 0;
  $lat       = isset($_GET['latitude']) ? $_GET['latitude'] : 0;

 $geo_array = array (
    'Address' => 'Perfect Place Rattanathibet',
    'AdministrativeAreaName' => 'Nonthaburi',
    'SubAdministrativeAreaName' => 'Muang Nonthaburi',
    'CityName' => 'Saima',
    'StreetName' => 'Rattanathibet Road',
    'CountryName' => 'Thailand',
    'PostalCodeNumber' => '11000'
 );
 //set option for usign openstreetmap by using file_get_contents
 $opts = array('http'=>array('header'=>"User-Agent: StevesCleverAddressScript 3.7.6\r\n"));
 $context = stream_context_create($opts);
 //url for the openstreetmap
 $homepage = file_get_contents("https://nominatim.openstreetmap.org/reverse?format=json&lat=".$lat."&lon=".$lon."&zoom=27&addressdetails=1",false,$context);
 $homepage_json = json_decode($homepage,1);
 //assigned data from the openstreetmap to array
        $geo_array['Address']=$homepage_json['display_name'];
        $geo_array['AdministrativeAreaName']=$homepage_json['address']['state'];
        $geo_array['SubAdministrativeAreaName']=$homepage_json['address']['suburb'];
        $geo_array['CityName']=$homepage_json['address']['city'];
        $geo_array['StreetName']=$homepage_json['address']['road'];
        $geo_array['PostalCodeNumber']=$homepage_json['address']['postcode'];
        $geo_array['CountryName']=$homepage_json['address']['country'];
 //convert to xml 
 $xml = new SimpleXMLElement('<Location/>');
 array_walk_recursive($geo_array, function ($value, $key) use ($xml) { $xml->addChild($key,$value);});
 echo $xml->asXML();

?>