星期五, 11月 20, 2015

UART over Wifi by NodeMCU (Programming NavSpark via ESP8266)

動機

NavSpark是個包含GPS功能的Arduino相容版, 詳情請看我之前的網誌: NavSpark Mini初體驗 .
會選用這片做為Arduino, 想必會用到上面的GPS功能, 但麻煩的是, 每次coding燒錄完之後, 若要確定程式正確, 勢必得挑一個可以收到GPS訊號的地方. 我當然大可以帶著筆電和NavSpark去外面coding, 但在寒冷的晚上又要餵蚊子, 不是個很好的coding環境.

又或者我可以拉一個GPS天線到室內, 然後接上NavSpark的IPX接頭.


以上兩個方法似乎都不是很好的方式, 後來我想到UART X Wifi的方式, 這當然不是甚麼先進的想法, 一些天文觀測的同好早就用這樣的方式, 在室內/帳棚內輕鬆遙控寒冷星空下的望遠鏡.
但是這類的周邊通常都不太便宜(當然淘寶找可以便宜很多....), 若只是為了開發驗證用, 這樣的開銷划不來.

串列埠轉WIFI模組 UART to WiFi EM-380C(BB-MAXCHIP) NT$3,300
A06-0029 UART轉WIFI模組 NT$1890


剛好我手邊有片ESP8266 Wifi模組, 又具備UART的功能, 看來只要適當的設定就可以達到UARTx Wifi ! 而且這片ESP8266只花費百圓餘而已!



com0com/com2tcp

如果有兩張ESP8266, Wifi的細節由EPS8266內部處理掉是最理想的了, 可惜的是我手邊只有一片ESP8266可用...



透過com0com/com2tcp的方式, 可以省略掉USB-Serial, 但是需要多一個WIFI Adapter, 不過若是用NB, 應該不會缺乏WIFI Adapter.


本文是朝向使用com0com/com2tcp的方向規劃.
另外, com0com官網上的安裝檔附的驅動不含簽名, 在win7下是無法使用的, 建議可以改下載[1]或[2]的com0com安裝檔進行安裝.

NodeMCU

根據[3], ESP8266可以用AT Command/NodeMCU/原生SDK/Arduino等方法開發(WebSDK就不適用於這裡的用途了, IoT比較適合).
看來比較適合且不用花太多時間的就屬NodeMCU和Arduino, 其中NodeMCU是以script方式執行, 可以略過編譯及燒錄的冗長時間, 最後NodeMCU出線.

為了用上NodeMCU, 需要先將Node MCU Firmware燒錄到ESP8266, 可以參考[3]的說明操作.

Telnet Server

由於com2tcp支援telnet協定, 因此ESP8266端運行一個telnet server, 將接收到的訊息傳送到UART, 再將UART發出的訊息回送到telnet client, 如此就可以做到雙向溝通.
運行在NodeMCU上的telnet我是以[4]為基礎下去修改. 結果下面會提到.

首先NodeMCU將init.lua及wifi.lua設定為以下內容:

--init.lua
dofile("wifi.lua")
--wifi.lua
print("set up wifi mode")
wifi.setmode(wifi.STATION)
wifi.sta.config("skyforce","0913679376")
 --here SSID and PassWord should be modified according your wireless router
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function() 
    if wifi.sta.getip()== nil then 
        print("IP unavaiable, Waiting...") 
    else 
        tmr.stop(1)
        print("Config done, IP is "..wifi.sta.getip())
        --dofile("yourfile.lua")
    end 
 end)

telnet server的script如下,  但不建議一開始就放在init.lua直接執行, 因為執行script後, UART會直接轉向telnet, 因此NodeMCU無法再透過UART被操作, 等於NodeMCU會變成磚(只剩下UART轉Wifi的功能), 除非重燒韌體.

所以請先用手動執行的方式, 確認整個環節都打通了, 再把telnet server script放到init.lua讓他開機自動執行.
telnet.lua[4]:
--simple_telnet.lua
baudrate = 115200
telnet_port = 23
uart.setup( 0, baudrate, 8, 0, 1, 0 )

s=net.createServer(net.TCP,60) 
s:listen(telnet_port ,function(c) --c : net.socket module
   --send 
   function s_output(str) 
      if(c~=nil) 
         then c:send(str) 
      end 
   end 
   --node.output(s_output, 0)   -- re-direct output to function s_ouput.
   uart.on("data", 0, s_output, 0) 

   --receive
   c:on("receive",function(c,l) 
      --node.input(l)           -- works like pcall(loadstring(l)) but support multiple separate line
      uart.write(0,l)
   end) 

   -- disconnect
   c:on("disconnection",function(c) 
      node.output(nil)        -- un-regist the redirect output function, output goes to serial
   end) 
end)
若要NodeMCU開機時就啟動telnet server, 將init.lua改為:
--init.lua
dofile("wifi.lua")
dofile("telnet.lua")


com0com/com2tcp的設定

com0com照預設的方式安裝好, 並不需要額外的設定. 只要記得com0com的兩個COM port即可.



com2tcp則按照下面的參數執行
com2tcp --baud baudrate \\.\com##  ip port
baudrate的部分照NavSpark UART的baudrate去設定即可, NavSpark mini的UART預設為115200, 因此我也設定在115200, 但115200用來燒錄其實很慢.
com##則要看com0com安裝時配給的com來決定, 依照我的環境設定COM16, 而COM15提供給Arduino或GNSS Viewer燒錄用.
ip則填入NodeMCU跟ap所取得的ip.
port則按照telnet標準port為23.

GNSS Viewer燒錄問題

GNSS Viewer燒錄時可以改變原本的baudrate, 縮短燒錄時間, 但這一招用在UART x Wifi似乎行不通, 比較可能的解釋是這樣的:

在原本的架構下, GNSS Viewer通知NavSpark改變baud rate, 然後comA接著更改到相同的baud rate, 兩邊就可以用新的baud rate繼續溝通



但是當我們採用Wifi的方式燒錄,  架構中共有三個UART設定, GNSS Viewer可以改變UART1, NavSpark也改變了對應的baud rate, 但是com2tcp對應的UART2及ESP8266對應的UART3卻沒有跟著改變, 因此整個UART並沒有用相同的baud rate去運行, 因此整個baud rate改變的機制無法正常運作.



暫時想不到解決方法, ESP8266或許可以攔截UART訊號去改變baud rate, 但是com2tcp該怎麼作到動態改變baud rate我就不知道了. 目前最快的方式, 可能是直接將UART1/2/3的baud rate設高一點縮短燒錄時間.

com2tcp若不開啟 baud rate emulation, 是可以不用care baud rate設定, 參考自這裡. 因此UART2的設定可以don't care.




[參考]

[1]Com0Com v3.0.0.0 utility for W7 x64 platform, signed driver.
[2]Com0Com v3.0.0.0 utility for W7 x86 (32bit) platform, signed driver.

IoT x MQTT Resource



MQTT Server/Broker

MQTT Server/Broker Benchmark

HiveMQ MQTT Broker


MQTT Web Client

A full-featured MQTT client for your browser

MQTT Android Client

IoT Manager

DIoTY

ESP8266 MQTT Client

NodeMCU MQTT CLIENT MODULE

星期一, 11月 09, 2015

Memory Layout of C

近來開發Arduino遇到了記憶體配置的問題, 但Arduino內沒有足夠的debug資訊讓我了解是stack或heap overflow, 所以我想透過stack或者heap的指標位址來判斷可用的記憶體空間.


爬完wiki上的Data segmanet介紹, heap在下stack在上, heap跟stack是面對面, 中間夾出的區域就是可用的記憶體空間. 但是我先用visual C++來驗證, 卻發現跟wiki描述的不符, 似乎是相反過來的!?

後來在stackoverflow找到有人跟我同樣疑惑, 看來是linux/windows在記憶體配置上是有差異的.

win32的記憶體配置應該如下圖, heap跟stack是背對背, 往不同方向去成長.

星期三, 11月 04, 2015

ESP8266 ESP-201 X Arduino

網路上較少ESP-201當Arduino的中文文章, 所以每次要接線都要翻閱資料許久. 英文資源雖不少, 但每次重看都需要稍微消化一下才懂.
這張全pin引出, 且可安裝在麵包版的ESP-201(雖然需要小小改造一下), 是很適合拿來開發的板子. 我把開發ESP-201的基本設置筆記如下, 方便記性不太好的我可以翻閱.



ESP-201 header改造

ESP-201這張模組雖然拉出所有pin-out很方便, 但犯傻做錯了兩件事情:
  1. RX/TX的header方向讓ESP-201無法安裝在麵包板上
  2. 把pin的名字印在電路板的背面, 這樣裝上麵包板誰看的到
或許一開始設計就不打算讓大家裝在麵包板上.......
首先要解決第一個問題, 根據[2], 把RX/TX的header焊到另外一端即可, 或者你要更搞剛把兩個11-pin header焊到另外一邊, 這樣上述兩個問題就一次解決.......否則就照下圖的方式修改[2]:
before

after



ESP-201接線

但是ESP8266 Arduino官網卻沒提到如何燒錄/連結ESP-201的資訊, 這讓我有點頭痛.
另外ESP-201上面標示的pin-out也跟一般ESP8266不一樣, 必須了解一下對應關係....
幸好已經有心人整理出下面這些圖[1]:




ESP8266 Arduino官網提到Generic ESP8266的連接方法[3]:



但是這個方法需要USB-Serial可以拉出RTS, 以便控制ESP8266 Reset. 我手邊的USB-Serial都沒有拉出RTS, 像這種:



全部pin-out都有拉出的模組是比較適合搭配ESP-201的:


若你的USB-Serial也沒有RTS, 可以手工焊上鍍銀線把RTS拉出來, 但是沒地方可固定感覺不是很穩固, 只好作罷. 後來找到這張表:


模式
GPIO
1520
1SDIO1xx系統工作在 SDIO 模式, 可以用外部 MCU 驅動内部WIFI
2工作模式011系统從外部FLASH 啟動
3燒錄模式010系统自動進入升級狀態,等待Serial-port下達命令



照表操課, 如果要燒錄的話, 要這樣接[2]:
GPIO0和GPIO15有接地即可燒錄. GPIO2可能內部有上拉電阻(?), 所以沒接也ok.



但每次上電後只能燒錄一次, 若要再燒錄必須斷電, 或者讓 RST接地讓ESP-201Reset.
我是直接拉出RST到微動開關,微動開關接地, 再加一個上拉電阻10k確保不會沒事Reset, 這樣每次要重新燒錄前, 按一下微動開關就好了.




還有人將ESP8266所有pin-out整理成一張非常棒的表[4], 開發時接線很方便:



我試著將上述幾張表整合成一張, 方便查詢:


Arduino IDE環境設置

接好線後, 設置ArduinoIDE環境, 我是使用 Arduino core for ESP8266 WiFi chip 提供的core, Board Manager URLs 為:
 http://arduino.esp8266.com/stable/package_esp8266com_index.json


安裝好官方Arduino IDE後, 再設定Boards Manage即可使用. 細節請直接見 Arduino core for ESP8266 WiFi chip官網.


ESP-201燒錄

從node.info()讀出來的訊息[2]:
flash size(byte)flash mode (SPI mode)flash speed(Hz)
512040000000

但我後來發現, 每一片ESP-201的flash不一定一樣, 同樣從node.info()讀出來, 我手上的ESP-201 flash參數如下:
flash size(byte)flash mode (SPI mode)flash speed(Hz)
512220000000

其中flash mode的部分不太確定數字對應的意義, 若參照[5]的說明:spi mode(0=QIO, 1=QOUT, 2=DIO, 3=DOUT)

註: 後來發現node.info()讀出來的值, 跟當初燒錄韌體時的設定是連動的, 也就是說這裡的值是設定好的, 未必直接關連到板子上的flash.
若你是用NodeMCU的燒錄工具, node.info()的值則直接關連到下圖的設定值:


Arduino IDE燒錄時的設定應該如下:



Flash Frequency的地方, 預設只有40和80MHz, 額外的頻率需要自行設定, 在 AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-947-g39819f0  的目錄下(可能因為esp8266-arduino版本不同而目錄名稱略有不同), 編輯 boards.txt:




找到FlashFreq的欄位, 新增20/26.7兩種頻率即可.


[參考]

  1. ESP8266 ESP-201 module - first impressions
  2. ESP8266: ESP-201 breakout board review
  3. Generic ESP8266 modules
  4. ESP8266之GPIO功能、資源探索
  5. MOD-WIFI-ESP8266 Reflashing question

http://www.barissanli.com/electronics/nodemcu.php
http://www.areresearch.net/2015/05/flashing-running-esp-201-module.html

ESP8266 ESP-201 module - antenna troubleshooting


星期一, 10月 12, 2015

AviSynth & Super-Resolution初體驗 - Part1 靜態影像

最近在研究Super-Resolution(簡稱SR), 論文可以找到一狗票, 但是真正有做成軟體實在不多, 效果好得更是少. SR應用在靜態影像上大概只有CSI犯罪現場, 平常老百姓如我如果需要SR, 大多是想把解析不到1080的老舊影片, 撥放在FHD的螢幕上, 又可以呈現出細節. 所以能轉出SR的影片才是最重要的, 但是try來try去, 商業軟體沒看到效果很好的(或許要花大錢才有效果), 免費軟體更是沒看到, 最後我找到AviSynth.

AviSynth是幹嘛用的我就不介紹了, 個人接觸的也不深, 有興趣的請直接google.
總之我想要將影片透過AviSynth的Filter(plug-in), 用Super-Resolution演算法轉出高解析影片. AviSynth內建的resize filter就算了, 稱不上SR, 直接在External filters的頁面, Resizers裡找到一個有趣的東西: Waifu2xAvisynth.

Waifu2xAvisynth是waifu2x porting到AviSynth的版本, 原始的waifu2x是lua語言撰寫, WL-Amigo先porting成C++版本, 再來sunnyone從C++版本改成AviSynth Plug-in.
waifu2x適合用在動漫相關影像的影像放大, 這個原始waifu2x網址提供了靜態影像的轉換, 我轉了一些圖出來大家可以比較看看:

原圖


Lanczos 200%


waifu2x網站 200%


Waifu2xAvisynth 200%



原圖


Lanczos 200%


waifu2x網站 200%


Waifu2xAvisynth 200%



Lanczos是目前地表最強的resize演算法, 但waifu2x的細節又多上許多. waifu2x網站和Waifu2xAvisynth 在細節上差異不明顯, 但是對比以及色彩表現明顯有差異, 估計是Waifu2xAviSynth所採用的色彩空間及轉換過程跟waifu2x是不太一樣.

提供一下我的測試script. 將此Script放在AviSynth目錄下的Examples即可, handle.png換成你的圖檔檔名:
LoadPlugin("..\plugins\waifu2xAvisynth.dll")
ImageSource("handle.png", end=0)
ConvertToYV12(matrix="PC.709")
Waifu2x(nr=0, scale=2)

下次我們再來測試Super-Resolution的影片轉換.

[2015/10/15更新] 結果Waifu2xAviSynth轉不動影片... 因為它太慢了, 只能off-line轉換, 但是off-line還是太慢, 轉了一個晚上才轉出幾個frame... 看來影片要有Super-Resolution只能靠madVR了.


星期一, 9月 28, 2015

Android Studio引入OsmAnd (Check out OsmAnd in AndroidStudio)

Android官方的IDE已經從Eclipse轉移到Android Studio了, OsmAnd官方建議的IDE還是在Eclipse, 看來要在 Android Studio下編譯OsmAnd要花點時間研究一下了, 況且官方文件非常缺乏=.=

經過我整理和簡化之後, 照以下步驟就可以編譯出apk了:
You can check out OsmAnd in AndroidStudio with step-by-step :

1. Check out project from Version Control

In Android Studio's "Welcome to Android Studio" page, select "Check out project from Version Control" .



2. 我是從自己fork出來的github上做clone, 改回官方的github當然也可以.
接著花點時間clone

In "Clone Repository" page, clone from github's OsmAnd : https://github.com/osmandapp/Osmand



3. clone完, gradle的部分照預設值就好不用動

In "Import Project from Gradle" page, select "Use default gradle wrapper (recommended) "



4. 可以看到clone這麼多project回來

After import project, in "Project Window" should have 11 projects clone from github.



5. 接著要去OsmAnd-resources下載resources, 記得目錄要更名為 "resources" 並且跟Osmand放在同一層目錄

Download OsmAnd-resources, and rename directory  to "resources", place with OsmAnd Project directory.



6. 如果要在x86架構的Genymotion下執行, 要改一下Build Variant

Open Build Variant window: Build->Select Builder Variant



7. 原本是預設在Armv5下, 要改成X86才可以在Genymotion上面運作

Set OsmAnd module's Build Variant with x86 or Fat. (Fat means include all cpu's library)



8.最後按下Run就可以在Genymotion上執行了.

Run and execute on Genymotion. (or your android mobile phone)

星期三, 8月 26, 2015

NavSpark Mini初體驗


NavSpark是之前在indiegogo上集資成功的專案, 成品是Arduino+GPS, 32bit mcu, 並且體積相當小(大概就Arduino Nano的大小)

之後出了一片NavSpark mini, 是NavSpark的相容版, 硬體規格一樣, PCB更小, 當然pin out也比較少, 但是一些小專案應該夠用了, 而且還是內建GPS receiver (但是天線要外接)
現在原廠在推廣NavSpark mini, 索取一片只需要運費9usd, 非常划算.
我週五下單, 隔周三就到貨, 收的是國際運費, 但是用的是本地快遞(新竹寄到新竹), 就當作用運費贊助這間公司了(有附發票XD).



收到貨後有兩片PCB, 分別是NavSpark mini主板以及USB-UART轉板, 這片轉板是走Android手機常用的micro USB而非mini USB, 電平3.3V, 接上吃3.3V的NavSpark mini的剛剛好.
若是用自己的USB-UART轉板, 就要特別注意電壓的部分, 免得把NavSpark mini燒了

接著就是準備開發環境, 首選當然是Arduino IDE, 但是Arduino IDE原生是不支援NavSpark mini的, 你有兩種選擇:
  1. 從NavSpark官網下載支援的Arduino IDE 1.5.6 載點
  2. 從Boards Manager下載NavSpark的支援 NavSpark原廠說明
第一種我啟動不了, 第二種我可以用, 就懶得管第一種發生甚麼問題了...

按照原廠接線圖接好, 就可以用Arduino IDE燒錄了.
剛玩了一下就出問題, 怎麼樣都燒不進去



爬文之後才發現, NavSpark mini是可以選擇要不要燒GNSS library進去的(Global Navigation Satellite System).

如果燒錄時選擇不要GNSS library, 就不會有boot-loader(所以boot-loader是放在GNSS library裡面的....), 那下一次就無法讓Arduino IDE直接透過USB做燒錄的動作.
(我不懂這樣的邏輯是甚麼, 誰說不要GNSS就用不到boot-loader? )

The Non-GNSS library does not have boot-loader code within, thus program compiled with Non-GNSS library needs to run from recovery ROM mode to load code

NavSpark的boot方式有ROM Mode以及Flash Mode,  對應mcu韌體的載入來源.
如果沒有燒boot-loader到Flash, 就只能改用ROM Mode還原boot-loader,
為了改用ROM Mode, NavSpark mini的BOOT_SEL就身負這樣的重責大任

BOOT_SEL: Default unconnected, internally pulled-high, Venus822A runs program from internal Flash memory. Whenconnected to GND, Venus822A runs program from internal ROM memory. When improperly written user code hangsthe system, it would be necessary connect BOOT_SEL to GND and recover from ROM mode to load corrected code.
所以short BOOT_SEL到GND, 就可以讓NavSpark mini從ROM memory拉回原本預先燒好的code, 當然boot-loader也包含在內, 只要遵循以下的步驟:

1. Connect BOOT_SEL pin to GND to run program off internal ROM memory.
2. Check state of GPIO4 and GPIO5, these two pins determine baud rate used for UART1 (USB) communication when
booting from internal ROM memory. See next section on how to set command and code upload baud rate to use
for Arduino IDE in case GPIO[5:4] connected to differ from default 2’b11.
GPIO[5:4] = 2’b00 for 9600
GPIO[5:4] = 2’b01 for 4800
GPIO[5:4] = 2’b10 for 38400
GPIO[5:4] = 2’b11 for 115200 (default)
3. Press the reset button and release it to restart the LEON3 processor.
4. Use Arduino IDE to do the code upload procedure with the correct binary code.
5. Once code upload completes, disconnect BOOT_SEL from GND to run from Flash memory, press the reset button
and release it to restart.

到此應該可以正常燒錄了?!
其中標示紅色的第二步驟最為重要, 由於GPIO4/5決定ROM Mode的baud-rate, 在不設定的狀況是被認定為接地的, 所以預設的baud-rate會是9600, 用Arduino IDE因為baud-rate設定不同事無法燒錄的.
因此需要在未上電的狀況下, 將GIPO4/5接在3.3V再上電, 確保GPIO[5:4]是在高電位讓baud-rate設定在115200bps.
若已經上電再去接GPIO4/5後reset是沒有效果的.

如果用不到GNSS library, 這樣每次燒錄就是要不斷的short BOOT_SEL, reset... 燒錄....
如果不差GNSS library佔掉的記憶體的話, 我看燒錄還是直接放GNNS library進去吧...

[附註] NavSpark Error code對應的意義(參考這裡):
1 - Can't open firmware binary file.
2 - Parameter error, unsupported baud rate.
3 - Can't open COM port.
4 - Sent download command but receive no ACK response
6 - Loader program sent binary file size command but receive no ACK response
7 - Sent firmware in 8KByte block but receive no ACK response
8 - No END command received, denoting Flash checksum error

[資源]

星期一, 12月 22, 2014

兩輪自走車 Bala (Part 2)

這是目前Bala的結構, 已經可以透過手機控制, 能做基本的前進後退轉彎了.

目前馬達的轉速偵測, 是在輪上以紅外線Sensor判斷輪圈的肋骨, 所以走一圈有5個pulse, 以轉速控制來說非常不夠. 目前已經尋覓好直接在馬達上偵測轉速, 轉一圈有50個pulse, 精準度提高了10倍.

除了轉速控制, 姿態控制也還沒納入, 所以操縱起來非常困難.
有可能加速過猛, 導致車子翻了一圈,

而現在採用的馬達控制IC(也就是雙H橋IC)是選擇L9110S, 但是這顆IC沒有剎車的功能, 所以當馬達不轉的時候車子還會繼續滾動, 這個時候車子是在不受控的狀態, 因此改用支援電子剎車的IC是有必要的.

所以接下來首要進行開發的步驟有:

  1. 高精準的馬達PID轉速控制
  2. 根據姿態決定加速
  3. 馬達電子剎車

星期一, 8月 25, 2014

Gearuino '04-08

Gearuino是我學習Arduino後的第一個專案, 這計畫從13年的11月開始到14年8月終於結束了.....當然中間也空了兩三個月完全沒動.
中間也改版了兩次, 這是第二版:



目前完成品是第三版, 實體如下:


兩個版本的佈局差不多, 最大的差別是第三版的七段顯示器全部採用0.56"的尺寸, 因為大於0.56"的都太暗了, 不符白天行車使用.

Gearuino跟一般抬頭顯示器不一樣的地方在於, 它可以顯示檔位, 這對很多純自排車來說, 非常難得, 檔位的顯示也讓超車時能有個譜, 知道油門該踩多重, 退多少檔, 才能拉上多少轉速.

這其實也是我DIY HUD的利基點之一, 否則直接買市面上現成的就好了.
而第二個利基點是可以自己選擇字體的大小, 但後來發現亮度足夠的七段顯示器, 最大大概只做到0.56", 再上去普遍偏暗.


這是實際裝置在車上的樣子, 左上是時速, 右上就是檔位, 左下是油耗顯示, 右下也是油耗, 只是以數字顯示.


這是另外一個實際使用狀況, 旁邊是既有使用的HUD, 但是已經有些數字損壞, 所以才有DIY HUD的構想.


Gearuino的構造如上, 包括一個OBD轉USB的接頭, 以及Gearuino的主體.
Gearuino主體包括了Arduino Pro mini, 兩顆Max7219控制7個七段顯示器和兩個Bar LED.
右下角還有五個按鈕可以切換每組LED的顯示功能, 像是水溫, 進氣溫度, 節氣門角度等等OBD有提供的資訊, 大多可以顯示.

其實Gearuino在開發時遇到最大的難點在於七段顯示器的選用。
七段顯示器的顏色有 亮紅, 綠,  黃, 橘以及高亮紅(或綠), 經過實際測試結果, 高亮紅堪用, 至於高亮綠比較難找, 還沒有實際上車試過.

最後為了避免紅色的PCB板造成反光, 影響到行車, 所以用黑色厚紙卡手工作了簡單的外殼:


DIY的東西美觀度本來就比不上量產產品, 但是功能上卻可以自由發揮, 有任何想法只要一點時間, 一點構思, 實現出來都不難.
接下來若有閒暇時間, 應該會著手進行第四版, 僅有時速和檔位顯示, 並且盡量縮小體積.

星期三, 8月 06, 2014

兩輪自走車 Bala (Part 1)

一切都要從這張草圖開始


Bala是甚麼? Bala其實就是台語發音的 "拔辣", 也就是芭樂的發音. 同時"拔辣"也代表手榴彈的意思. 因為這台自走車一開始就是要設計成手榴彈外觀的造型, 才叫作 Bala.

作這台Bala, 一來是因為想要在室內跟兒子玩遙控車 但是四輪遙控車在室內不好操控, 迴轉半徑過大, 兩輪車就沒有這樣的問題, 但是市面上較少兩輪車, 除了 Sphero-2b 和 Jumping-Sumo. 但說到底還是自己做比較有趣(但是不見得比較省錢...)
 二來這是跟好朋友討論, 要一起進行的Arduino專案, 也是彼此最有交集的目標.

起初進行的是結構設計, 從完全沒有概念到下面初始的設計

依照上述概念設計, 稍作了修正的第一台原型底盤

目前的試跑結果:

  1. 底盤太寬太軟(材質應該為ABS), 所以行進偶有不太穩定的情形, 可把馬達位置內縮, 縮短底盤長度因應.
  2. 由於尚未做任何加速度/陀螺儀修正, 所以無法穩定減速, 動態也不穩定.
  3. 兩個輪分別由各自的馬達控制, 馬達因為製造誤差/組裝等等因素, 相同的pwm驅動下, 轉速卻不一致, 因此無法跑直線, 也無法穩定剎車(想像兩顆馬達在不同時間點停下, 路線就偏掉了)

接下來首要任務就是處理兩輪馬達轉速差異的問題.

iPhone 14 Pro vs Olympus EM10 MkII 中篇

時間來到2022年, 我的S20+因為綠線事件, 立馬被我淘汰了, 同時我也正計畫購入Mini Countryman, 很殘念的是該車系統只支援CarPlay而不支援Android AUTO, 所以我也開始考慮要不要從Android換到Apple陣營. 好, 上面都是題外話, 反...