古人智慧

Just Do it!
上士聞道,勤而行之;中士聞道,若存若亡;下士聞道,大笑之。不笑,不足以爲道。
~ 道德經 41

「實現夢想不是追逐成功,而是在於賦予生命意義,人生中的每個決定與聲音都有其重要含義。」"The key to realizing a dream is to focus not on success but on significance — and then even the small steps and little victories along your path will take on greater meaning."
電視名人-歐普拉·溫芙蕾(OPRAH WINFREY)

搜尋此網誌

Translation

2018年4月22日 星期日

[NodeMCU] L293D Motor shield board 電機驅動擴展板 應用

NodeMCU來控制馬達電機做個履帶機器人是最近想要做的項目,雖然是很普通的項目,但是加上攝像顯示屏還有一些sensors應該是個很好的運動平台。

《把NodeMCU直接插上》

《插上後狀態》
看上這片L293D擴展板是因為可以直接用NodeMCU,而且把全部的I/O都外接與VccGround規劃在一起,是個不錯的多功能的擴展板。
但是~~收到這板子,要命了。。。。這擴展板的footprint尺寸與手上的NodeMCU不適配,手上的NodeMCU比較寬將近2mm。也因為這樣,這片擴展板就被擺在桌角。
今天剛好瞄到,拿到手上把玩了一下,突然靈光一現,用排針座!!!
是的,90°排針座的尺寸剛剛好,太棒了~~~
立馬用烙鐵焊上,大小通吃!!

《腳跑出床外。。。》

《90°排針座剛好》

《呵呵,大小通吃》
既然接上了,那就繼續把這擴展板徹底研究清楚。
找遍x寶都找不到這片擴展板的原理圖,只好用萬用電錶一條條量測,還好沒很多條。
下圖就是示意圖。
《L293D接腳與擴展版圖》

《正面解說圖》

《尺寸圖》

測試工具與設備

NodeMCU x1
L293D Motor Shield board 電機擴展板 x1
5-12v電機馬達
萬用電錶 x1
電源供應器 x1

測試code

/*
 * RegisHsu 2018-04-22
 * The L293D motor shield board for NodeMCU
 * Enable 1-2: nodemcu pin 1
 * Enable 3-4: pin 2
 * 1A: pin 3
 * 2A: pin 5
 * 3A: pin 4
 * 4A: pin 6
 */

#define __NODEMCU__

#ifdef __NODEMCU__
// NodeMCU與ESP8266 pin對照表
// These are the pins for all ESP8266 boards
//      Name   GPIO    Function
#define PIN_D0  16  // WAKE
#define PIN_D1   5  // User purpose
#define PIN_D2   4  // User purpose
#define PIN_D3   0  // FLASH mode at boot time
#define PIN_D4   2  // TXD1 (Note: low on boot means go to FLASH mode)
#define PIN_D5  14  // HSCLK
#define PIN_D6  12  // HMISO
#define PIN_D7  13  // HMOSI  RXD2
#define PIN_D8  15  // HCS    TXD0
#define PIN_D9   3  // RXD0
#define PIN_D10  1  // TXD0

#define E1 PIN_D1  // Enable Pin for motor 1, every pin can be PWM in ESP8266
#define E2 PIN_D2  // Enable Pin for motor 2

#define I1 PIN_D3  // Control pin 1 for motor 1
#define I2 PIN_D5  // Control pin 2 for motor 1
#define I3 PIN_D4  // Control pin 1 for motor 2
#define I4 PIN_D6  // Control pin 2 for motor 2

#else
//      Name   GPIO    Function
#define PIN_D0   0
#define PIN_D1   1
#define PIN_D2   2
#define PIN_D3   3
#define PIN_D4   4
#define PIN_D5   5
#define PIN_D6   6
#define PIN_D7   7
#define PIN_D8   8
#define PIN_D9   9 
#define PIN_D10  10

#define E1 PIN_D8  // Enable Pin for motor 1
#define E2 PIN_D9  // Enable Pin for motor 2

#define I1 PIN_D3  // Control pin 1 for motor 1
#define I2 PIN_D5  // Control pin 2 for motor 1
#define I3 PIN_D4  // Control pin 1 for motor 2
#define I4 PIN_D6  // Control pin 2 for motor 2

#endif

void setup()
{
  Serial.begin(115200);

  pinMode(E1, OUTPUT);
  pinMode(E2, OUTPUT);

  pinMode(I1, OUTPUT);
  pinMode(I2, OUTPUT);
  pinMode(I3, OUTPUT);
  pinMode(I4, OUTPUT);
  Serial.println("Setup already...");
}

void L_Wheel(int sp, bool s1, bool s2)
{
  analogWrite(E2, sp); // Enable as speed
  digitalWrite(I3, s1);
  digitalWrite(I4, s2);
}

void R_Wheel(int sp, bool s1, bool s2)
{
  analogWrite(E1, sp); // Enable as speed
  digitalWrite(I1, s1);
  digitalWrite(I2, s2);
}

int spd = 1020;
void loop()
{
  Serial.print("SPD=");
  Serial.println(spd);
  //FF
  Serial.println("FF...");
  L_Wheel(spd, HIGH, LOW);
  R_Wheel(spd, HIGH, LOW);
  delay(2000);
  L_Wheel(0, LOW, LOW);
  R_Wheel(0, LOW, LOW);
  delay(2000);

  //RR
  Serial.println("RR...");
  L_Wheel(spd, LOW, HIGH);
  R_Wheel(spd, LOW, HIGH);
  delay(2000);
  L_Wheel(0, LOW, LOW);
  R_Wheel(0, LOW, LOW);
  delay(2000);

  //FR
  Serial.println("FR...");
  L_Wheel(spd, HIGH, LOW);
  R_Wheel(spd, LOW, HIGH);
  delay(2000);
  L_Wheel(0, LOW, LOW);
  R_Wheel(0, LOW, LOW);
  delay(2000);

  //RF
  Serial.println("RF...");
  L_Wheel(spd, LOW, HIGH);
  R_Wheel(spd, HIGH, LOW);
  delay(2000);
  L_Wheel(0, LOW, LOW);
  R_Wheel(0, LOW, LOW);
  delay(2000);
  spd = spd - 100;
  if (spd < 200)
    spd = 1020;
}

視頻分享

2018年4月8日 星期日

[ESP8266] MicroPython + TFT-LCD

想找個小屏來做個有趣的玩具,前些時間買一套樹莓派3B包含攝像頭3.5“TFT-LCD
也用3D打印機做個漂亮的外殼。

好不容易把camera和屏的驅動都設定好,準備開始拿來做有攝像與顯示功能的Robot,結果樹莓派3B不給力,用沒多久就開始開機不順然後直接掛點,還好camera與3.5“屏都可用。
既然樹莓派3B掛點,但對這個3.5”屏非常有興趣想知道底層driver如何控制電阻式touch與TFT-LCD屏。手上有幾片ArduinoESP8266,心中在想是否可以用來學習點亮這個屏? 花了好幾天睡覺時間google很多相關這個屏的pinout電路原理圖,看來全球還真不少強人已經跑在前面好多,車尾燈都不見。。。
這屏的TFT driver是ILI9486,touch driver是XPT2046。在搜尋過程中,這個神人寫的driver驅動最厲害TFT_eSPI,幾乎把可接的LCD屏都寫好並優化加速。
雖然很完整,但是我是想要學習如何透過SPI控制LCD與Touch,能一步步下command觀察屏driver的反應,Python應該是最佳選擇。

前言 MicroPython

MicroPython真是不錯的project,用ESP8266跑起來還算順,但是memory的空間非常有限,我的pyhton code只要稍微多寫一些,就很容易就出現“MemoryError: memory allocation failed,xxxxxxxxx”。所以,MicroPython在ESP8266只能當做實驗作用,無法做成有用的產品。

材料設備

步驟一,NoteMCU與LCD接線

這個屏都是透過SPI配合幾根control pin如chip selectCommand-Datainterrupt來控制,接腳不多但是軟件開發似乎難度不低。。。
NoteMCU pinout%20pinout.pdf)
TFT-LCD pinout
NoteMCU     TFT-LCD
=======     ========
D8              TFT-CS(24)
D3              Command/Data(18)
D4              Reset(22)
D1              Touch-CS(26)
D7              MOSI(19)
D6              MISO(21)
D5              CLK(23)
+5              +5(2)
GND           GND(6)

TFT_CS = 15   # TFT Chip select control pin D8
TFT_DC = 0    # Data Command control pin D3
TFT_RST = 2   # Reset pin pin D4
TOUCH_CS = 5  # Touch Chip select control pin D1

NodeMCU與ESP8266 pin對照表

// These are the pins for all ESP8266 boards
//      Name   GPIO    Function
#define PIN_D0  16  // WAKE
#define PIN_D1   5  // User purpose
#define PIN_D2   4  // User purpose
#define PIN_D3   0  // FLASH mode at boot time
#define PIN_D4   2  // TXD1 (Note: low on boot means go to FLASH mode)
#define PIN_D5  14  // HSCLK
#define PIN_D6  12  // HMISO
#define PIN_D7  13  // HMOSI  RXD2
#define PIN_D8  15  // HCS    TXD0
#define PIN_D9   3  // RXD0
#define PIN_D10  1  // TXD0

#define PIN_MOSI 8  // SD1
#define PIN_MISO 7  // SD0
#define PIN_SCLK 6  // CLK
#define PIN_HWCS 0  // CMD

#define PIN_D11  9  // SD2
#define PIN_D12 10  // SD4

步驟二,下載MicroPython並燒錄到NoteMCU

下載Firmware,我選擇esp8266-20171101-v1.9.3.bin
依照以下指令,安裝ESP8266燒錄工具後,先將NoteMCU的flash清乾淨,然後燒錄MicroPython Firmware。
pip install esptool
esptool.py --port /dev/cu.usbserial erase_flash
esptool.py --port /dev/cu.usbserial --baud 460800 write_flash --flash_size=detect -fm dio 0 esp8266-20171101-v1.9.3.bin
如果沒發生任何錯誤,這MicroPython應該已經完整上傳ESP8266。按下NoteMCU板子上的reset後,MicroPython就開始作動。

步驟三,透過terminal進入MicroPython的對話模式

在MacOS環境,打開Terminal,輸入以下指令
screen /dev/cu.usbserial 115200
這時候應該進入MicroPython的對話模式,按幾下Enter會出現>>>的符號,表示NoteMCU準備接收下指令。輸入簡單指令測試
>>> print('hello esp8266!')
hello esp8266!
>>> import esp
esp.check_fw()
NoteMCU應該回應剛剛燒錄的Firmware version。
重要: 要退出screen,按下CTRL-A+CTRL-K然後回答yes即可退出

步驟四,上傳TFT-LCD的測試code

這是我寫的測試code,分享在GitHub。
那,如何從GitHub下載後如何上傳到NoteMCU?

步驟五,設定NoteMCU上網與File Transfer

輸入以下的code,讓NoteMCU連上家中Wifi AP。
import network
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('<your ESSID>', '<your password>')
sta_if.ifconfig()
會回應類似的IP address
('192.168.0.2', '255.255.255.0', '192.168.0.1', '8.8.8.8')
這樣NoteMCU就應該連上Wifi AP。
再來就是上傳Python code,不然自己慢慢“摳”到死。。。
參考WebREPL設定

方法一

這個方法簡單,但是會影響PC/Mac上internet。

方法二(我喜歡的方法)

在MicroPython對話模式下這個指令,把WebREPL啟動(Enable)
import webrepl_setup
E啟動,再輸入簡單密碼。這個密碼是運用REPL上傳Python code都需要輸入。
下載REPL,然後解開zip file後在folder內下運行以下的指令就可以上傳Python code。
./webrepl_cli.py raspi35.py 192.168.0.2:/raspi35.py
輸入密碼後就上傳。

步驟六,執行上傳的Python code

最重要的部分出現啦。。。
輸入指令就可以執行剛上傳的code
exec(open("raspi35.py").read())
接下來就可以看到類似這樣的圖形在LCD上,就大功告成!!!

參考:

我的開發桌面~~

2018年3月18日 星期日

[Banana Pi] send email by SMTP Server(send only)

最近做了一個追蹤美金的python code可以每天從台灣銀行下載當天的匯率製作出歷史曲線圖

《美金匯率歷史曲線圖》
把這個code放到小電腦(樹莓派香蕉派),然後自動透過email把曲線圖寄出。
好玩的唄。。。。
當然,有人肯定會說這東西早就有人做好了,為何還要ooxx。。。。
~只能說~~~我就是想做好玩學點東西,阿不然?
這篇先記錄如何在小電腦BananaPi設置email server相關步驟做個筆記,不聊到如何coding這個python爬蟲:

Step1:

設定這台小電腦的ip 與 domain name。
sudo nano /etc/hosts
在nano裡面修改

127.0.0.1 localhost.localdomain localhost
aaa.bbb.ccc.ddd your.domain.name your_machine_name
aaa.bbb.ccc.ddd 填上真實對外的ip address
your.domain.name 填上你的domain name
your_machine_name 填上你這台小電腦的名稱(在/etc/hostname裡面)

Step2:

安裝email server相關套件與config,還有uuencode做附加檔的指令。
sudo apt install mailutils 
sudo dpkg-reconfigure exim4-config
有關exim4-config就參考前人筆記(底下有參考文章),簡述幾個重點。
  1. 選擇 “internet site; mail is sent and received directly using SMTP”。
  2. “The ‘mail name’ is ….”填上domain name,也就是yourname@[xxxx.xxx.xxx] xxx的部分。
    其他都按Enter跳過

Step3:

先找個jpeg或png做個附加檔,然後用這個語法把email送出去做測試。
mail -s"title" -A attach_file receiver@email -aFrom:sender@email < email_body_file
或者

echo "write down the email body here" | mail -s"title" -A attach_file receiver@email -aFrom:sender@email
注意:每個參數都必須存在,不能省略
title: email的主旨
attach_file:要附加的檔案
receiver@email:收件人的email
sender@email: 發信人的email,可以自己杜撰的email address
email_body_file:一個文字檔,要寫在email body的文字

Step4:

設定每日固定時間把email發出。
sudo crontab -l
sudo crontab -e
-l :list 目前所有例行性工作
-e :edit 例行性工作
我先把2個工作寫成script
#!/bin/bash
python3 /home/regis/python/currency/currency_trend_v3_2.py
echo "Today USD currency" | mail -A/home/regis/python/currency/currency.png -s"USD currency" xxxxxx@xxxx.com -aFrom:regis@xxxxx.xxxx.xxx
然後,將這個script帶入例行工作
sudo crontab -e

# 
# m h  dom mon dow   command
* 10 * * * /home/regis/python/currency/cy_pic_send
設定為每天早上10點發出
就是這麼簡單,但是我搞了一整天。。。。
時間就是不夠用
~~

參考文章:

2018年3月4日 星期日

[旅遊]深圳灣-海上世界

在兩岸來來回回將近20年,深圳發展的速度真讓人驚訝,人民的素質也越來越高,薪資水準也高過台北。當然,在深圳這彈丸之地,擁有2000萬人口,房價也是高過台北。。。
反觀台灣,一堆政客在胡搞,唉。。。
喔,脫離主題了。每次從蛇口到office都會經過海上世界深圳灣公園,這次抽空來晃晃。沿著海岸步道走了將近3個多鐘頭,整個公園非常乾淨,而且規劃的還不錯。可惜的是,海水不是很乾淨。聽說以前更髒更臭,現在深圳政府大力改善,已經具備成效。
有圖有真相 ,開始為看官們一一解說。

深圳灣

深圳地鐵站

現在深圳地鐵規劃的還不錯,乾淨整齊與科技化。自動充值機,進出閘門,乘車標示都具科技化。
當列車到站時,除了廣播之外,車道門上的日光燈的亮度會提高,提醒效果佳
深圳通卡,與台灣的捷運悠遊卡一樣
到紅樹灣站
百度地圖導引,跨過高速公路,走了約10鐘到海邊,一路上看到不少豪宅與很多大樓建設趕工
這裡的特產,共享單車
嗯,步道與草皮很乾淨,但海水就差一點。
指引圖,有點看不懂
自拍一下。。。
民眾帶家人在草地上休息聊天
這個是2011年點聖火的石柱
這麼乾淨的公園,應該歸功這麼勤奮的清潔員。。。
剛好有個外國妞坐在岸邊
海邊的碎石都很乾淨,但海水濁。。。

海上世界

一出地鐵站,都是餐廳、酒吧與飲料店,台灣的特產奶茶店也在。。。
重點是船上餐廳
走累了,走進旁邊的酒吧,喝個啤酒解渴。。。人民幣18元還算OK
還算大杯,店裡的擺設也不錯
嗯,磕完花生,享受啤酒後,就差不多回Hotel休息與用功去。。。。。
快到3/8婦女節,整個地鐵都在打天貓廣告