利用CAN BUS進行ODrive位置控制影片如下
2023年5月25日 星期四
odrive perform Sunnysky X2212 980KV motor with Encoder TLE5012B
利用CAN BUS進行ODrive位置控制影片如下
2023年5月14日 星期日
ESP32 利用 uart communication with mega2560 並用 wifi mesh 控制
開發構想: 用ESP32透過UART與Arduino Mega2560溝通並透過ESP32的WiFi mesh的功能做指令的控制. 如下圖: 手機端的painless mesh的APP連接ESP32, ESP32利用UART2與Mega2560的UART1做指令的傳輸
下圖左為ESP32的com port訊息圖右為Mega2560的com port訊息實作結果:手機傳送DIO14_ON的指令, 透過廣播到ESP32再傳輸到Mega2560去控制Relay4作動.
2023年5月9日 星期二
ESP32 + MCP2515 use CanHacker on CAN Bus system
在之前文章CAN BUS 通訊研究中, 利用了MEGA2560+MCP2515去做CAN BUS上接收和傳送資料. 最近看到一篇文章 可以用ESP32去做CAN BUS上的sniffer來分析.
CANHacker 參考 https://github.com/autowp/arduino-canhacker install library
其中是想利用他的windows端的軟體CANHackerV2.00.01.exe來做CAN bus analyzer
功能傳輸圖:
2023年5月7日 星期日
ESP32 Bluetooth SPP Profile Application
Purpose:
“ESP32 uses BT SPP Profile to connect with mobile phones or PCs and transmit strings through BT functions to perform specific functional actions for functional strings.”
#include <BluetoothSerial.h>
BluetoothSerial BT; //宣告藍芽物件,名稱為BT
void setup() {
Serial.begin(115200);
BT.begin("BT_Test"); // BTName為藍芽廣播名稱
}
void loop() {
BT.println("Hello World!"); //傳輸到藍芽裝置
//檢查藍芽內是否有資料
while (BT.available()) {
//讀取藍芽資料
String BTdata=BT.readString();
//顯示在序列視窗
Serial.println(BTdata);
BTprocessCommand(BTdata); // do something with the command
}
}
void BTprocessCommand(String data)
{
if (data == "LED_OFF")
{
Serial.println(F("LED_OFF"));
vTaskSuspend(hled);
}
if (data == "LED_ON")
{
Serial.println(F("LED_ON"));
vTaskResume(hled);
}
}
以上程序為ESP32端的code
手機端最簡單方式可以用現成的APP
Arduino Bluetooth Control
2023年5月5日 星期五
C# use windows API for Auto testing mehtod
最近自動測試案子遇到廠商沒有sample code可用, 只得用最原始的暗黑技術來做:
1. 執行廠商可用的執行程式
2. 利用C#呼叫API模擬類似"按鍵精靈"的作法去點擊廠商的程式
以上做法可以解決沒有sample code可以包進自己的測試程式裡.
下面介紹所利用到的windows API
先將廠商程式開啟
hyper = new Process();
hyper.StartInfo.FileName = "c:\\ISP Programmer_V1.5.10\\ISPProgrammer.exe";
hyper.Start();
if (hyper != null){
hyper.WaitForExit(2000);
HyperWindow = FindWindow(null, "ISP Programmer_V1.5.10");
if (HyperWindow != IntPtr.Zero) {
EnumChildWindows(HyperWindow, new CallBack(delegate (IntPtr hwnd, int lParam) {
listWnd.Add(hwnd);
GetWindowText(hwnd, title, title.Capacity);
GetClassName(hwnd, className, className.Capacity);
return true;
}), 0);
SendMessage(listWnd1[8], BM_CLICK, 0, 0); //發送點擊按鈕的消息
}
}
在利用FindWinsow找到開啟的程式
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
在用EnumChildWindows去找程式上component的handle依據各個handle用Sendmessage去做觸發或讀取的功能
[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
public const int BM_CLICK = 0xF5;