記事では、ふた付きの通常のバケツを自動のバケツに変える方法を説明します。
彼はバケツに行った-蓋が開いて、必要なものを入れて、消えた-蓋が閉じた。
バケツは光沢のある金属を使用し、蓋はペダルで開きます。そのようなバケツは多くの店で見つけることができます。
バケットを完成させるために、IR LED、IRレシーバー、サーボドライブ、およびマイクロコントローラーが使用されました。
サーボ過負荷の管理と制御は、AtmelマイクロコントローラーATtiny44Aを使用して実行されます。
管理プログラムはAtmel Studio 6.1のCで書かれています。
電子充填
作業アルゴリズム
- IR LEDは特定のバイナリコードを絶えず送信し、IR受信機がそれを読み取り、偶然に一致した場合、ふたを開けるコマンドが発行されます。
- 蓋を開いた後、7秒間待って、センサーがアクティブでない場合は蓋を閉じます。
- 蓋を開けているときに障害物にぶつかった場合、きしむ音を立てて、しばらく(3秒)待ってからもう一度試してください。 失敗が繰り返される場合は、より長い時間(60秒)の間「眠りに落ちる」。
IRセンサー
動作原理は、障害物からの赤外線の反射特性に基づいています。
IRダイオードは変調されたコードメッセージを空間に送信し、IR受信機はそれを受信します。
送信電力を調整するには、トリミング抵抗RV1を使用します。
信号の搬送周波数は38 kHzです。
二相(マンチェスター)コーディングが使用されます。 クォーツ周波数の安定化は必要ありません。
ビットコーディングの波形は次のとおりです。
パケット波形は次のとおりです。
IRレシーバー(私はVishay TSOP4838を使用しました)が信号を受信し、デコードしてパケットを反転形式で出力します。
パケットは一定時間後に繰り返されます:
IRレシーバーはスマートデバイスであり、適切なパケット形式の理解に合わない干渉、さまざまなパルスを抑制して、信号をフィルターで除去しようとします。
したがって、パケット間には、最小値以上の休止が必要です。
たとえば、TSOP4838を使用しているときに、8ビットのパケット長で15ビットを一時停止すると、受信者はパケットをスキップすることがよくあります。
30ビットのポーズ-パケットは渡されません。
サーボ駆動
蓋を開くには、標準のFutaba S3001サービスが使用されます。
彼女は、4.8 Vで4.8 kg-cm、6 Vで3 kg-cmの出力を持っています。
カバーは金属製で比較的重いですが、このサーボで十分です。
位置決めの期間中のみサーボに電力が供給されます。 これには、ロジックレベルのMOSFETトランジスタが使用されます。
0.5オームの抵抗を使用して、サーボドライブが消費する電流を制御します。
マイクロコントローラーは、その両端の電圧降下を測定し、超えた場合、サーボへの電源をオフにします。
蓋を開けたときの消費電流のピーク値は500 mA、閉じたとき-150 mA、「妨害」-550 mAです。
サーボドライブは、0.02秒ごとに続く1.1〜1.8ミリ秒のパルスで制御されます。
制御パルスの終了後、必要に応じてサーボドライブの位置決めが開始されます。
オシログラム:
黄色-制御パルス、青-サーボ消費(シャントでの電圧降下)。
これは、通常のサーボ位置決めの開始の波形です。
移動の途中の通常の位置:
サーボ妨害波形は次のとおりです。
開始時に、手をつなぐ:
ご覧のとおり、最初の段階では、サーボが動くかどうかに関係なく、かなり多くの消費があります。
また、サーボの瞬間的な消費は特定の値を超えることはできません。また、理想的な場合、青いグラフの下の領域を計算する必要があります。
プログラムでは、シャントの電圧降下がADCを使用して読み取られ、期間中の瞬時値を合計する簡単な方法が使用されます。 量が特定のしきい値を超えると、サーボが停止します。
しきい値は実験的に選択されます。
保護がトリガーされた値はEEPROMに保存されます。
スキーム:
プログラム
プログラムはAtmel Studio 6.1のCで書かれています。
DIPパッケージに14ピンのAVR ATtiny44Aマイクロコントローラーを使用。
IR LEDの38000 Hzを簡単に得るために、約7904000 Hzの周波数で動作します。
デフォルトの周波数は8 MHzで、周波数7.9 MHzはOSCCALレジスタを変更することにより取得されます。
5 Vの電圧で値0xA7を取得しました。
供給電圧または温度が変化すると、周波数はわずかになりますが、これはIRセンサーの性能に影響しません。
送信-IR信号の受信、サーボ駆動の制御、カウントダウン、988 kHzの周波数で動作し、高速PWMモードに設定された単一の8ビットタイマーが使用されます。
信号周波数はOCR0Aレジスタによって設定されます。 タイマーカウンター(TCNT0)がリセットされる値が含まれています。
パルスのデューティサイクルを定義する値は、OCR0Bに入力されます。 私たちの場合、50%。
タイマーは、IRダイオードが接続されているコントローラーの出力での値の変化が周期ごとに2回(OCR0Aで設定)-TCNT0がゼロで、TCNT0がOCR0Bであるように構成されます。
等値TCNT0とOCR0Bの割り込みでは、IR信号を送受信するすべての作業が実行されます。
ISR(TIM0_COMPB_vect) { static uint8_t IR_error = 0; if(++IR_pulsecnt == IR_BIT_LENGTH/2) { if(IR_pausecnt == 0) { if(((IRSENS_IN & IRSENS) == 0) != ((TCCR0A & (1<<COM0B1)) != 0)) IR_error = 1; TCCR0A ^= (1<<COM0B1); } } else if(IR_pulsecnt == IR_BIT_LENGTH) { IR_pulsecnt = 0; if(IR_pausecnt) { if(--IR_pausecnt == 0) { // after pause send again IR_send = IR_SENDDATA; goto IRStartSending; } } else { if(IR_send == 0) // Packet was sent { if(IR_error == 0) IRDetected = 1; else IR_error = 0; IR_pausecnt = IR_PAUSEBITS; TCCR0A &= ~(1<<COM0B1); // assumes that COM0B0 = 0 } else { IRStartSending: TCCR0A = (TCCR0A & ~((1<<COM0B1))) | ((1<<COM0B1) * (IR_send & 1)); // assumes that COM0B0 = 0, if 1 - generate (Clear OC0B on Compare Match, set OC0B at BOTTOM) IR_send>>=1; } } } }
送信機能の特性は、ビットバッファが0のときにパケットが送信されたと見なされることです。これは、パケットの上位ビットに常に1が存在する必要があることを意味します。
TCCR0AレジスタのCOM0B1ビットがセットされると、IR信号の生成が開始されます。 COM0B0ビットは0であり、以前はどこにも設定されていなかったことがわかります。
同じタイマーのオーバーフローの割り込みでは、サーボ制御、時間のカウントダウン、ボタンのチャッター抑制が実行されます。
標準モードでは、ふたを開けるのは2段階で行われます。最初は数サイクルゆっくりと、次に完全に開くまで素早く。 サーボドライブとトラクションの負荷を軽減するために作られました。
最初のボタンは、蓋を手動で開閉するために使用されます。
2番目のボタンは、開始を停止し、クイックオープンモードを有効/無効にします。
組立
サーボは垂直リンクに接続され、水平リンクとペダルは捨てられます。
IRダイオードとレシーバーは、突き出ているプラスチック製の脚に取り付けられています。 それらに十分なスペースがあります。
ビデオ:
ソース:
yadi.sk/d/OGTOvX73Agk8h