rt-net / RaspberryPiMouse

Raspberry Pi Mouse Device Driver
Other
60 stars 458 forks source link

Reset uncontrollable motor frequency to zero. #72

Closed ShotaAk closed 3 years ago

ShotaAk commented 3 years ago

What does this implement/fix?

モータのPWM周波数が小さい時(< 5Hz)に、周波数を0にリセットします。

変更の背景

(エビデンスを見つけられていませんが)Rapsberry Piは、PWMパルスを1周期出力し終えるまで、PWM周波数を変えることができないようです。 そのため、1 HzのPWM周波数を設定すると、1秒間はモータを回すことができません。(回そうとしますが、回りません)

この仕様は、ジョイスティックコントローラでラズパイマウスを操作する際に影響します。 スティックを倒してラズパイマウスを走らせる場合、一瞬でも1 Hzの周波数を設定してしまうと、スティックを倒したにもかかわらずラズパイマウスが動かない、という状況が発生します。

Does this close any currently open issues?

いいえ

How has this been tested?

Ubuntu 20.04 で、±5 Hz からモータが回ることを確認しました。

$ echo 1 > /dev/rtmotoren0
$ echo 1 > /dev/rtmotor_raw_l0
$ echo 1 > /dev/rtmotor_raw_r0
$ echo 5 > /dev/rtmotor_raw_l0
$ echo 5 > /dev/rtmotor_raw_r0

Any other comments?

周波数の下限値が5 Hzで良いかは判断が難しいです。 下限値を大きくしすぎると細かい制御が効かなくなるので、感覚で適度な値を選びました。

Checklists

Tiryoh commented 3 years ago

10Hz以下で動かすような場合はまずないと思います。5Hz以下の指令値は0とする方針はいいと思います。 一応再現確認をしてみました。

(エビデンスを見つけられていませんが)Rapsberry Piは、PWMパルスを1周期出力し終えるまで、PWM周波数を変えることができないようです。

以下のスクリプトを作成して動作確認をしました。 再現する場合と再現しない場合があるようでした。

#!/usr/bin/env bash
set -ue
echo start 800
echo 1 > /dev/rtmotoren0
echo 800 > /dev/rtmotor_raw_r0
echo sleep 2sec
sleep 2
echo stop
echo 0 > /dev/rtmotor_raw_r0
for i in `seq 10`; do
    echo start 1
    echo 1 > /dev/rtmotor_raw_r0
    echo start 800
    echo 800 > /dev/rtmotor_raw_r0
echo sleep 2sec
sleep 2
done
echo stop
echo 0 > /dev/rtmotor_raw_r0
echo 0 > /dev/rtmotoren0

使用したハードウェアの構成はRaspberry Pi 4 + Raspberry Pi Mouse V3です。

# RaspberryPiMouseドライバのバージョン
$ git rev-parse --short HEAD
ea99d87
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:    10
Codename:   buster
$ uname -a
Linux raspberrypi 5.10.17-v7l+ #1403 SMP Mon Feb 22 11:33:35 GMT 2021 armv7l GNU/Linux

https://user-images.githubusercontent.com/3256629/125750730-63b18019-c02d-4cb1-b64f-a3d81aaca655.mp4

Tiryoh commented 3 years ago

5Hz

https://user-images.githubusercontent.com/3256629/125756606-744ceddb-7a38-4afe-9947-67ed324f3ab8.mp4

Tiryoh commented 3 years ago

10Hz

https://user-images.githubusercontent.com/3256629/125756831-6dacc072-0662-4f2e-9ba9-1ada4cd15be8.mp4

Tiryoh commented 3 years ago

本PRの内容適用後は https://github.com/rt-net/RaspberryPiMouse/pull/72#issuecomment-880479378 にて記載したスクリプトを実行してもモータが止まることはなくなることを確認しました。