【MFT2019】クワエルマウス:FxFyFz3軸で移動出来た<合力に応じた加速処理追加>

WS1できました。FxFyFzの3軸分力だけでマウスポインタとして機能できることが確認できました。(指操作ですので動作原理ができたということです、未だ、歯とのグリップとクリック動作の開発が残ってます)


●ノウハウ
ノウハウ1:噛む力はFzで検出してますが、上下移動座標に使ってますが、噛む力しか制御できないので、圧縮方向しか検出できません。そこで、Fy方向(前後の押す)力を追加して前押し力と噛む力が加わった時はFzの方向をマイナスを掛け算して上移動させる処理をプログラムしました。

ノウハウ2:動きがぎこちないので、IBMトラックポイントのノウハウを調べて、加える力に応じてカーソルの速度を加速する加速処理のプログラムを追加しました。

●Arduino  Pro-microのプログラム  バグ多数あり

//==================================================
// BiteMouse (カムマウス)WS1プログラム rev021
// Arduino Pro micro互換 中華Pro Micro ATmega32U4 5V/16MHz
// 使い方は、下記リンクを参考にさせていただきました。
//https://ht-deko.com/arduino/promicro.html
// 原理:3軸センサでFxがカーソルの左右 Fzで上下移動座標ですが、
// 1:FzとFyの組み合わせで上下方向していしてます。
// 2:FxとFzの合力ベクトルの大きさでカーソルの速度を加速させてます。
//====================================================#include <Mouse.h>
#include <HX711.h>
int Fx;
int Fy;
int Fz;
int Fx_1;
int Fy_1;
int Fz_1;
int gainxN=1;
int gainzN=1;
double vector;
HX711 scale;
HX711 scale2;
HX711 scale3;
//Variables
double gainx=1;
double gainz=1;
int Fxr;
int Fyr;
int Fzr;
void setup() {
Serial.begin(38400);
// initialize mouse control:
Mouse.begin();
//HX711 initialize Sub
Hx711_setup();
}

void loop() {
Fx_1=Fx;
Fy_1=Fy;
Fz_1=Fz;
Fx=int(scale.get_units());//HX711 Fx read
Fz=int(scale2.get_units());//HX711 Fz read
Fy=int(scale3.get_units());//HX711 Fy read
Fxr=abs(Fx)-abs(Fx_1);//相対座標X
Fyr=abs(Fy)-abs(Fy_1);//相対座標Y
Fzr=abs(Fz)-abs(Fz_1);//相対座標Y
// ===========vector値で加速係数変化===================
vector=sqrt(pow(Fx,2)+pow(Fz,2));
Serial.print(vector);
Serial.print(“——–“);
Serial.println(gainxN);
if (vector>=10){
gainxN=20;
gainzN=8;
Serial.print(vector);
Serial.print(“——–“);
Serial.println(gainxN);
}
if (vector<10){
gainxN=1;
gainzN=1;
}
// ===Fy値が前押し(マイナス)ならFzの方向を逆転=======
if (Fy<0){
gainz=-1;
}
if (Fy>=0){
gainz=1;
}
//===============================================
Serial.print(Fx);
Serial.print(“,”);
Serial.print(Fz);
Serial.print(“,”);
Serial.print(Fy);
Serial.print(“,”);
Serial.print(Fz*gainz*gainzN);
Serial.print(“,”);
Serial.print(Fx*gainx*gainxN);
Serial.print(“,”);
Serial.println(gainxN);
//Serial.print(“,”);
//Serial.println(Fyr);

if (abs(Fx)>2 || abs(Fy)>2) {
Mouse.move(Fx*gainx*gainxN,Fz*gainz*gainzN,0);
}
}
void Hx711_setup(){
Serial.println(“Initializing the scale”);
// parameter “gain”is ommited; the default value 128 is used by the library
// HX711.DOUT ? pin #A1
// HX711.PD_SCK ? pin #A0
scale.begin(A3, A2);//Fx
scale2.begin(A1,A0);//Fz
scale3.begin(A9,A8);//Fy
Serial.println(“Before setting up the scale:”);
Serial.print(“read: \t\t”);
Serial.println(scale.read()); // print a raw reading from the ADC
Serial.println(scale2.read()); // print a raw reading from the ADC
Serial.println(scale3.read()); // print a raw reading from the ADC
Serial.print(“read average: \t\t”);
Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC
Serial.print(“read average2: \t\t”);
Serial.println(scale2.read_average(20)); // print the average of 20 readings from the ADC
Serial.print(“get value: \t\t”);
Serial.println(scale3.read_average(20)); // print the average of 20 readings from the ADC
Serial.print(“get value: \t\t”);
Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight (not set yet)
Serial.print(“get value: \t\t”);
Serial.println(scale2.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight (not set yet)
Serial.print(“get units: \t\t”);
Serial.println(scale3.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight (not set yet)
Serial.print(“get units: \t\t”);
Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided
Serial.print(“get units2: \t\t”);
Serial.println(scale2.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided
Serial.println(scale3.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided
// by the SCALE parameter (not set yet)
scale.set_scale(2280.f); // this value is obtained by calibrating the scale with known weights; see the README for details
scale.tare(); // reset the scale to 0
scale2.set_scale(2280.f); // this value is obtained by calibrating the scale with known weights; see the README for details
scale2.tare(); // reset the scale to 0
scale3.set_scale(2280.f); // this value is obtained by calibrating the scale with known weights; see the README for details
scale3.tare(); // reset the scale to 0
Serial.println(“After setting up the scale:”);
Serial.print(“read: \t\t”);
Serial.println(scale.read()); // print a raw reading from the ADC
Serial.print(“read2: \t\t”);
Serial.println(scale2.read()); // print a raw reading from the ADC
Serial.print(“read average: \t\t”);
Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC
Serial.print(“read average2: \t\t”);
Serial.println(scale2.read_average(20)); // print the average of 20 readings from the ADC
Serial.print(“get value: \t\t”);
Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight, set with tare()
Serial.print(“get value2: \t\t”);
Serial.println(scale2.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight, set with tare()
Serial.print(“get units: \t\t”);
Serial.println(scale.get_units(5),1); // print the average of 5 readings from the ADC minus tare weight, divided
// by the SCALE parameter set with set_scale
//Serial.print(“get units2: \t\t”);
Serial.println(scale2.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight, divided
// by the SCALE parameter set with set_scale
Serial.println(“Readings:”);
}

●WS2を開始します。

口先だけで支持できるように小型軽量化をめざして、WS2の開発を始めます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です