電子機噚ず猫STM32で猫甚のロボット玩具を組み立おたす



こんにちは、ハブロビテス。

ここで開発に関する蚘事を最埌に曞いおからかなりの時間が経ちたしたが、それを修正する時が来たした。

この蚘事では、STM32F101マむクロコントロヌラヌ䞊に小さなロボットを組み立おお、メむンクヌンであるArthasを楜したせ、どのような問題に盎面し、䜕が出おきたかに぀いおお話したす。



問題の背景ず説明



半幎前、私はこの黒いハンサムなメむンクヌンを手に入れたした。このメむンクヌンは、コンピュヌタヌゲヌムの有名なヒヌロヌに敬意を衚しおアヌサスず名付けたした。

画像



猫は非垞に遊び心があり、走るのが奜きで、埅ち䌏せから攻撃し、犬のようにボヌルを持っおきたす。 私は長い間䜕も集めおいなかったので、猫甚の小さなおもちゃを開発するこずにしたした。

䞻な芁件は次のずおりです。



  1. 猫の歯ず爪、理想的には完党に密閉された䜓ボヌルからの構造の重芁な郚分の保護
  2. 前の段萜から、デバむスの小さな寞法の芁件に埓いたす。 サッカヌボヌルではなく、小さなボヌルであるこずが望たしいです。
  3. 携垯電話/タブレットおよびデスクトップコンピュヌタヌから制埡する機胜-車茪を再発明せず、モバむルデバむスずの互換性を確保するには、Bluetooth接続が理想的です。
  4. それをもっず面癜くするために、将来的にはロボットを倚かれ少なかれ自埋的にするこずができる、少なくずも䜕らかの皮類のセンサヌを持぀こずが望たしく、単なるラゞコンマシンではありたせん。
  5. コテの泚意を匕くために音を匕き出す方法がある。




すぐに、起こったこずの短いビデオをデモンストレヌションしたす。猫ボットはテストモヌドで実行されおいたすコンピュヌタヌから制埡されたす。



猫ボットは倖殻なしでテストされ、猫を匕き付ける音を出し、逃げられたせん ドラむブの1぀が故障したす。

蚘事の最埌にこれに぀いおの詳现





猫ボットアセンブリ



猫はロボットにあたり積極的に反応しないように思えるかもしれたせんが、実際には、テスト䞭に、圌はすでに100回それを぀かんで、それを持ち去っお、぀たみたした。 もちろん、私はロボットを遞択したした終了するたでので、猫は床にいるロボットを芋ながら、攻撃しおすぐに連れ去られないようにしばらく埅぀こずにしたした



次に、開発プロセス自䜓に぀いお説明したす。



開発芁玠の遞択ず準備


本䜓


提案された蚭蚈を決定したので、私は2぀の半分から成るプラスチックボヌルのペアを賌入したした-1぀は盎埄60 mm、もう1぀は80 mm、最初のものが収たらない堎合に備えお。 このような寞法により、゚ンゞンずセンサヌの遞択が倧幅に制限されたしたたずえば、超音波センサヌを忘れおしたい、ボヌルに収たらず、さらに密閉された空間では機胜しないずいう意味で。



画像



マむクロコントロヌラヌ


「目」を芋萜ずした埌、ボヌルは身䜓の圹割の理想的な候補になりたした。 サむズが限られおいるため、最も小型のケヌス、぀たりほずんどの堎合QFNを䜿甚しお回路党䜓を蚭蚈するこずが決定されたした。

STM32F101は、36 MHzで動䜜でき、64 KBのフラッシュず16 KBのRAMを備え、最も重芁なのは、6x6 mm QFNで利甚できる䞀方で、ストリップダりンされたM0ではなくCortex M3コアに基づくマむクロコントロヌラヌであるため、䞭倮プロセッサずしお遞択されたした軍団



センサヌ


センサヌずしお、同じSTの3軞加速床蚈LIS331DLが遞択されたしたが、Terraelectronicsの割匕があったため、1個あたり玄30ルヌブルの䟡栌で入手できたした。



加速床蚈は3x3 mmのQFNケヌスで䜿甚でき、I2Cバスで通信できたす。これは、限られた寞法の条件で非垞に䟿利です。 加速床蚈を䜿甚するず、3軞に沿ったロボットの傟きを差し匕くこずができたす。たた、加速床を倉曎するこずによりロボットが動いおいるのか、障害物にぶ぀かっおいるかに぀いおの情報を取埗しようずするこずができたす。 さお、そしおもちろん、猫がきしむために圌を蹎る瞬間を決定したす-このようにしお猫はそれを生きおいるものず芋なしたす



コミュニケヌション


コミュニケヌションの手段ずしお、もちろん、実瞟のある安䟡で小型の䞭囜語HC-05モゞュヌルを䜿甚したす



これは、ロボットで唯䞀の既補のモゞュヌルです。



音源


圓初は小さなスピヌカヌを䜿甚したかったのですが、残念なこずに、小さなスピヌカヌでも非垞に倧きなものでした。 さらに、圌らは倚くを消費し、PWMでスむングするために、少なくずもトランゞスタずフィルタヌを必芁ずしたした。 䞀定量のグヌグルの埌、私はそのような面癜い圧電キヌキヌを芋぀けたした



Murata PKLCS1212E4001の䟡栌は48ルヌブルで、寞法は11x11 mmボヌド䞊で最倧の芁玠ですであり、暙準的なピ゚ゟサりンダヌです。圧電効果で膜が曲がるこずにより音を出すデバむスです。 そしおこれは、同じ音量でスピヌカヌがきしむよりも消費電流が桁違いに少ないこずを意味したす。

しかし、スピヌカヌずは異なり、非垞に巧劙で䞍均䞀な呚波数応答を持っおいるため、きしむ方法を知っおおくこずが最善です。 そしお最も倧きなこずは、圌女が4KHzの呚波数でこれを行うこずができるずいうこずですしかし、これはあなたが他の人にきしむこずができないこずを意味したせん



ドラむブ


最も重芁な芁玠は、ロボットを動かすドラむブです。 残念ながら、私たちが望むほどすべおがスムヌズではなかった。これに぀いおは蚘事の最埌で詳しく説明したす。 ドラむブずしお、私は芋぀けるこずができる最小のサヌボを取り、䞀定の回転のためにそれらを䜜り盎すこずにしたした。

私が遞んだのは、サヌブを取るこずで、15x20x8 mm皋床の堎合にモヌタヌ+ギアボックス+制埡ボヌドが手に入るずいう事実によるものです。 すべおの欲求で、私はそのような寞法のギアモヌタヌを芋぀けるこずができたせんでした。

その結果、187 マむクロルヌブルの䟡栌で、 サブマむクロサヌボが遞択されたした。





栄逊


すべおの芁玠が遞択され、システムに電力を䟛絊する方法ず方法を決定したす。 明らかに、最も小さく最適な゜ヌスは、小型のリチりムポリマヌバッテリヌです。 ドラむブには4.8Vが必芁なため、MAXIM Semiconductorsの小型DC-DCコンバヌタヌを䜿甚しお電圧を5Vに䞊げたす。 MAX8815は3x3mmケヌスの優れたチップであり、97の効率の負荷で最倧1Aを転送するこずができたすもちろん、プリント回路基板の正しいレむアりト、動䜜モヌド、およびストラップの遞択に垞に䟝存したす。

ドラむブは、ピヌク時でも合蚈で600 mAしか消費しないため、これで十分です。



残りの電子機噚に電力を䟛絊し、モヌタヌによる干枉から保護するために、DC-DCブヌストコンバヌタヌの埌、固定3.3V出力のTIの小型リニアレギュレヌタヌLP2985を配眮したす。



回路ず少しの構造




たず、ロボットの蚭蚈に関するいく぀かの蚀葉。 寞法ずコストを最小限に抑えるために、構造芁玠ずしおプリント回路基板を䜿甚するこずにしたした。 ぀たり、ドラむブは、ネゞで固定された2぀のプリント回路基板の間に固定されおいたす。 アセンブリおよびボヌドのデバッグ修正埌、埌ほどでは、すべお次のようになりたす。





ドラむブが倖に出ないようにするために、ボヌドずその衚面の間に玠晎らしい玠材を入れたした-Torres゚キスパンダヌからのラテックス

画像



実際のずころ、䞭囜でパチンコを買ったこずがありたす。 ホヌン自䜓はチタン合金で䜜られた非垞に快適でしたが、ゎムは地獄ではありたせんでした。 むンタヌネットでは、パチンコの専門家は、すぐにそれを捚おお、この同じ゚キスパンダヌを賌入し、それからハヌネスを切り取っお亀換するこずを勧めたした。 結果は私の期埅をすべお䞊回り、パチンコは非垞に匷力になりたした。 そしお以来 ゚キスパンダヌは倧きなもので、玠材の倧郚分は手付かずのたたで、匕き出しの䞭に暪たわり、翌で埅っおいたした。

ドラむブずボヌドの間のガスケットずしおこのラテックスを䜿甚した埌、ドラむブは手袋のように立ち、ミリメヌトル移動したせんでした。



したがっお、このような蚭蚈を実装するには、すべおのコンポヌネントが倖偎に集䞭しおいる2぀のボヌドが必芁です。

䜿甚可胜な領域が急激に増加しおいるため、䞋偎のボヌドにバッテリヌ充電噚、ミニUSBコネクタ、充電を瀺すLEDを配眮し、同時にBTモゞュヌルを配眮しお、バッテリヌがそれを芆わず、通信を劚げないようにしたす。

したがっお、TOPずBOTTOMの2぀のプリント回路基板が開発されたした。 䞀番䞋は既に蚀ったこずで、䞀番䞊はロボットの消化噚系、぀たりマむクロコントロヌラヌ、加速床蚈、コンバヌタヌ、電源ハヌネス、そしおもちろんピ゚ゟツィヌタヌです。



倩板のレむアりトは次のようになりたす。





電源スキヌム





脳



USBが䞍芁な5ボルトを駆動しないように、コンバヌタヌU1ずレギュレヌタヌU2のON入力を接続し、電源にプルアップし、ボヌドの端のピンJ1に接続したす-そこにGNDレベルを䟛絊するず、コンバヌタヌの入力ず出力が高むンピヌダンス状態になり、本質的に回路が砎壊されたすUSB電流を本来あるべき堎所に流したす-バッテリヌ充電回路ぞ。 コンバヌタの接続図の残りの郚分は、デヌタシヌトからの兞型的なものです。



U4加速床蚈は、プルアップ抵抗なしでコントロヌラヌのI2Cバスに接続されおいたす-はい、バスが動䜜するために必芁ですが、デヌタシヌトでは、䞡方のラむンがLIS331DL内に埋め蟌たれたプルアップ抵抗を介しおVdd_IOに接続されおいるず述べおいたす 奇劙なこずに、それらに関する情報はもうありたせんが、私はただ倀を認識しおいたせんでしたそしお、オフになっおいるず、トランゞスタによっおバスから切断されおいるようです。 だから私は盲目的にデヌタシヌトに頌らざるを埗なかった。 私は蚀わなければならない、私はこれを倱いたせんでした-加速床蚈は実際に远加の抵抗なしで完党に動䜜したす。

ただし、別の䞻芁な芁因が関連しおいたため、テストずFAXのセクションで確認できたす。



加速床蚈に加えお、猫の泚意を芖芚的に惹き぀けお指瀺ツヌルずしお機胜するように蚭蚈されたD1 LEDがコントロヌラヌに接続されおいるほか、平滑コンデンサヌC5を介しおコントロヌラヌのADCの入力に接続されおいる抵抗噚R4およびR5の分圧噚もありたす。 この分圧噚は、ADCが枬定できる範囲にバッテリヌ電圧をもたらし、バッテリヌレベルを刀断する機䌚を䞎えたす。

ちなみに、これらの抵抗噚にはミニFAXが接続されおいたした。 実際には、叀いモデルのように、コントロヌラヌに統合された基準電圧玄1.2ボルトがあるず仮定したした。 しかし、刀明したように、QFN36パッケヌゞのモデルには組み蟌み゜ヌスがなく、ケヌス内のREF入力は電源電圧3.3Vに近いため、4.2Vアキュムレヌタで1Vを䞎える抵抗を3Vを䞎える抵抗に倉曎する必芁がありたした。



LS1スキヌカヌは、そのピ゚ゟ゚ッセンスにより、コントロヌラヌピンに盎接接続できたす。その消費は非垞に小さく、共振呚波数でのむンピヌダンスは数癟オヌムです。 唯䞀の朜圚的な問題は、反察方向に機胜するこず、぀たり、倉圢䞭に応力が発生する可胜性があるこずです衝撃。通垞、保護ダむオヌドたたは抵抗が取り付けられおいたす。 しかし、実隓の結果によるず、平均力の衝撃時の電圧は、コントロヌラの保護出力ダむオヌドが凊理できる1.5Vを超えおいなかったので、䜙分な保護をかけないように挑戊したした。



コントロヌラヌの組み蟌みPWMゞェネレヌタヌからの出力は、ドラむブを制埡するためにピンJ8およびJ9に出力されたす。 非アクティブな消費を削枛するための远加のそしお䞍芁なものではない察策ずしお、GNDドラむブが接続されおいる接点J11およびJ12は、パワヌトランゞスタQ1によっおグランドから切り離されおいたす-ゲヌトに高レベルを䟛絊するず、ドラむブにグランド電力が䞎えられ、電流が内郚を流れたす。 刀明したように、れロPWM信号であっおも、ドラむブの制埡回路は䟝然ずしお䜕らかの電圧をドラむブに䟛絊し、完党に切断されたものず比范しお消費電力は10 mA増加したす。



重芁なポむントは、デバッグむンタヌフェむスの遞択です。 もちろん、寞法が非垞に限られおいる状況では、最小限のワむダでやりたいず思っおいたした。 しかし、いくらの情報は最小限の矛盟でした。 思慮深いグヌグルず実隓の埌、私はSWDむンタヌフェむスに萜ち着き、ピンSWDIOずSWCLKのみを衚瀺したした。 これに関連する別のファクトアップがありたす。これに぀いおは、「テストずファクトアップ」セクションで説明しおいたす。 しかし、芁するに、はい、これらの2぀のピンはほずんどの堎合デバッグに本圓に十分です。



底板は非垞に簡単に配眮されおいたす。





底板



Li-PolLi-Ionバッテリヌ甚の2぀の䞊列線圢充電チップ、Linear TechnologyのLTC4054が含たれおいたす。 これは、単セルリチりムポリマヌずリチりムむオンを充電する最も簡単な方法です。かなり䜎い効率超小型回路が線圢であるためがひどくないかどうかはわかりたす。

それらは完党に平行に䞊んでおり、いく぀かの䞭囜の蚈画では、最倧4぀の類䌌したmikruhiを䞊列に芋お、倧きな充電電流を提䟛したした。 個別に、それぞれ最倧800 mAを出力できたすが、これは目玉焌きを揚げたい堎合のみです。 負荷が500 mAを超え、バッテリヌが完党に攟電するず、マむクロ回路が枩たり始め、指を保持するこずができなくなりたす。 なぜなら 枩床保護回路が組み蟌たれおいたすが、これは原則ずしお怖いものではありたせん。120床たで暖たるず自動的に負荷電流が䞋がりたす。 しかし、これはあたり快適ではないので、蚱可された堎所の利益のために、2぀のピヌスを眮くこずを奜みたした。 充電電流は、2぀で玄500 mA぀たり、それぞれ250 mAになるように私が遞択した抵抗R4ずR5によっお蚭定され、そこでは加熱されたせん。



さらに、このボヌドにはミニUSBコネクタJ2、Q1トランゞスタがあり、USBが接続されおいる堎合、トップボヌドの電源回路のON入力をグランドにプルし、Bluetooth通信モゞュヌルを備えおいたす。



Resoniteでカヌドを泚文したしたが、予算内で出おきたした。2枚のマザヌボヌドカヌドが搭茉された6皮類のボヌドのパネルに2000r未満で支払いたした。

䞊䞋のボヌドは32x26 mmです。 組み立お埌および修正の修正前、トップボヌドは次のようになりたす。





そしお、䞀番䞋は次のようなものです。





テストファヌムりェアを䜜成したす。



ファヌムりェアのテスト




FreeRTOSに基づいお最終的なファヌムりェアを䜜成する予定です通垞のマルチタスク、ブロッキングキュヌなどの実装に時間を無駄にしないようにが、テストのために、すべおの呚蟺機噚を初期化し、コンピュヌタヌからの簡単なコマンドで管理できる小さなファヌムりェアをスケッチしたした。 初期化を芋おみたしょう。



クロッキングずGPIO


コヌド
void InitRCC() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); } void InitGPIO() { GPIO_InitTypeDef GPIO_InitStructure; //LED GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOB, &GPIO_InitStructure); //ADC GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_Init(GPIOA, &GPIO_InitStructure); //Buzzer GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET); //Servo GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; GPIO_Init(GPIOA, &GPIO_InitStructure); //Servo On/Off GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_Init(GPIOA, &GPIO_InitStructure); //Accel GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); //UART & BT Control GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOA, &GPIO_InitStructure); }
      
      







ここではすべおが簡単です-必芁なすべおの呚蟺機噚、぀たり入出力ポヌト、ADC、UART、2぀のタむマヌツむヌタヌ甚、PWMドラむブ甚およびI2Cにクロックを䟛絊したす。 次に、すべおのGPIOを構成したす。



スクむヌカヌ


コヌド
 void InitBuzzer() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_TimeBaseStructure.TIM_Period = 4; TIM_TimeBaseStructure.TIM_Prescaler = 1800; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM2, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM2, ENABLE); TIM_Cmd(TIM2, ENABLE); }
      
      







セットアップは、出力がビヌプ音に接続されおいるタむマヌを初期化するこずに芁玄されたす。 PWMを調敎したすが、実際には、パルス幅を倉曎せず、垞に50に蚭定したす。 代わりに、分呚噚を倉曎しお、タむマヌにパルスの呚波数を倉曎させ、異なるトヌンできしみ音を鳎らしたす。

システム呚波数は36 MHzなので、呚期を4に蚭定しすべお同じで、倧量のPWM攟電は必芁ありたせん、スプリッタヌ1800は4 KHzの呚波数を受信したした。



ドラむブ


コヌド
 void InitServo() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_TimeBaseStructure.TIM_Period = 0xFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0xB0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_Cmd(TIM3, ENABLE); }
      
      







スクむヌカヌず同じこずをしたすが、駆動に必芁なパラメヌタヌ、぀たり玄50 Hzの呚波数、および速床を非垞に正確に制埡するために十分な数の攟電を䜿甚しお、PWMの出力で既にシャヌプにしたす。 したがっお、プリセレクタヌは176に蚭定され、呚期は4096です。これにより、玄50 Hzず12 PWMビットが埗られたす。



加速床蚈ずBluetooth


コヌド
 void InitAccel() { I2C_InitTypeDef I2C_InitStructure; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 200000; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); } void InitBT() { USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
      
      







ここではすべおが簡単です-加速床蚈に぀いおは、200KHzの速床でI2Cをオンにするだけですアクセラレヌタはだいたい䜿甚可胜ですが。Bluetoothは通垞のUARTであり、暙準9600をオンにし、同時にコマンドを凊理する受信割り蟌みを蚭定したす。



次に、UART割り蟌み凊理コヌドを蚘述したす。 もちろん、これは最も成功しおいるわけではなく、チェックサムをチェックするこずさえ害になりたせんが、テストには圹立ちたす。 チヌムのキュヌで時間を無駄にしないために、1぀のチヌムに等しくしたす。これは、コントロヌラヌにチヌムを投げるこずができる頻床にのみ圱響し、圌がチヌムを芋逃すこずを恐れたせん。



コマンド受信コヌド


コヌド
 #define OPCODE 0 #define LENGTH 1 #define PAYLOAD 2 enum CommandStates {CS_DONE, CS_RECEIVING, CS_EXECUTING}; enum CommandCodes {CC_TEST=0x01, CC_SERVO_STATE, CC_SET_SERVO1_DS, CC_SET_SERVO2_DS, CC_GET_ACCEL_REG, CC_SET_ACCEL_REG, CC_GET_BATTERY, CC_LED_STATE, CC_BUZZER, CC_INVALID}; enum ErrorCodes {EC_NONE, EC_INVALID_CMD, EC_MAX_LEN_EXCEEDED}; enum ReplyCodes {RC_NONE, RC_EXECUTED, RC_TEST, RC_ACCELREG, RC_ERROR}; typedef struct { unsigned char Command; unsigned char State; unsigned char Length; unsigned char Payload[CMD_BUFFER_LEN]; }CommandDescriptor; CommandDescriptor Cmd; void InitCmd(CommandDescriptor *Comm) { Comm->Command=0; Comm->Length=0; unsigned char i; for(i=0;i<CMD_BUFFER_LEN;i++) Comm->Payload[i]=0; Comm->State=CS_DONE; //Init state at the end, to prevent interrupt from interfering } void SetInvalidCmd(CommandDescriptor *Comm, unsigned char ErrorCode) { Comm->Command=CC_INVALID; Comm->Length=3; Comm->State=CS_EXECUTING; //Just send back error Comm->Payload[0]=ErrorCode; } void USART1_IRQHandler(void) { char data; if ((USART1->SR & USART_FLAG_RXNE) != (u16)RESET) { data = USART_ReceiveData(USART1); switch(Cmd.State) { case CS_DONE: if(data>=CC_INVALID) { SetInvalidCmd(&Cmd, EC_INVALID_CMD); return; } Cmd.Command=data; Cmd.Length=0; Cmd.State=CS_RECEIVING; return; case CS_RECEIVING: if(Cmd.Length==0) { if(data>CMD_BUFFER_LEN) { SetInvalidCmd(&Cmd, EC_MAX_LEN_EXCEEDED); return; } Cmd.Length=data; BufPtr=0; return; } if(BufPtr<Cmd.Length-2) //Including opcode and length fields { Cmd.Payload[BufPtr]=data; BufPtr++; } if(BufPtr>=Cmd.Length-2) { Cmd.State=CS_EXECUTING; return; } case CS_EXECUTING: return; } } }
      
      







たず、コマンドの構造を発衚したす。実際には、コマンド自䜓、状態実行䞭、受信䞭、凊理䞭、パケット長既にリストされおいる2぀のフィヌルドを含む、およびペむロヌド0〜8バむトで構成されたす。 。

この構造を初期化するためのヘルパヌ関数ず、無効なコマンド倀を入力するためのもう1぀の関数に぀いお説明したす。

次に、割り蟌みに぀いお説明したす。 UARTで1バむトを受信するず、珟圚のコマンド「キュヌ」内の同じコマンドで䜕が起こるかがわかりたす-

そのステヌタスが実行が完了したこずを瀺しおいる堎合、正しいオペコヌドを受信したかどうかを確認し、そうでない堎合ぱラヌを報告したす。そうであれば、新しいコマンドを受信し始め、 CS_RECEIVINGに蚭定したす 。

受信䞭の堎合は、10バむトヘッダヌずペむロヌドの2バむトずヘッダヌの2番目のバむトで宣蚀された長さを超えないように、取埗する長さを制埡したす。 䜕かが間違っおいる堎合-゚ラヌを報告し、そうでない堎合-コマンドを受信し、 CS_EXECUTING状態になったず蚀いたす。 これ以降、誰かがこのコマンドにCS_DONE状態を蚭定するたで、私たちに来るすべおを無芖したす。

実際のラむンナップがあれば、受け取ったコマンドをその䞭に投げ蟌み、今のずころ以䞋を受け入れるこずができたす。



実際、それはすべおです-ファヌムりェアの䞻な機胜は、単に呚蟺機噚を初期化し、Bluetoothをオンにしお、コマンドのステヌタスがCS_EXECUTINGになるたで埅機したす。 その埌、圌女はコマンドを凊理しこのコヌドは枡さず 、ペむロヌドからレゞスタヌぞのバむトのオペコヌドに倧きなスむッチがありたす、 CS_DONEステヌタスをそれに蚭定したす。



void main


コヌド
 int main(void) { InitCmd(&Cmd); InitHardware(); DisableServos(); EnableBT(); EnableLED(); while(1) { if(Cmd.State==CS_EXECUTING) { ProcessCmd(&Cmd); InitCmd(&Cmd); } } }
      
      









䞀定の回転ず蚭蚈の問題のためのドラむブの倉曎


ドラむブはもずもず170床の範囲内で回転するように蚭蚈されおいたため、ロボット゚ンゞンずしお䜿甚するにはわずかにアップグレヌドする必芁がありたす。 サむズが小さいため、これは最初はそれほど単玔ではないかもしれたせん。

䞀般に、すべおのドラむブはサむズに関係なく同じように構築されたす-モヌタヌ、ギアボックスがあり、その出力軞は可倉抵抗噚ず同じ軞䞊にあり、制埡回路はシャフトの珟圚䜍眮に関する情報を削陀したす。



抵抗は、電源ずグランドの間の分割噚ずしお含たれおいたす。 出力軞のギアの1぀にストッパヌがありたす。これにより、サヌボが必芁以䞊に回転できなくなり、ポテンショメヌタヌ自䜓がそのようなストッパヌずしお機胜したす。 具䜓的には、これらのドラむブではすべおが非垞に簡単です-ストッパヌは出力シャフトの成長物であり、十分に倧きいため、切断するのではなく、ドラむブカバヌ内の突起を切断するのが簡単です



この突起ははんだごおで簡単に溶けるので、䞻なこずは回転を劚げるプラスチック片が残っおいないこずを確認するこずです。

ポテンショメヌタシャフトには、出力シャフトのギアで回転しないため、端に小さな切り蟌みがありたす。 ちなみに、このギアが入る小さな窪みにありたす。 したがっお、この切断の痕跡がなくなるたで、はんだごおで単玔に切断/融着したす。 すべお、ギアは可倉抵抗噚に觊れるこずなく静かに回転したす。



さらにすべおに泚油しおください。 䞭囜のスティンググリヌス、トップカバヌを閉じたす。 残りはほずんどありたせん。

底郚カバヌを開けるず、モヌタヌずポテンショメヌタヌに接続された制埡回路が芋えたす。



ポテンショメヌタからワむダを無慈悲に切断し、干枉しないようにサヌボから取り倖したす。 圌らが行ったコンタクトパッドに、2KOのSMD抵抗をはんだ付けし、合蚈抵抗を5KOhm皋床にしたす少しでも少しでも-怖くない、䞀定のディバむダヌを圢成したす。 2.4Kで2個をはんだ付けしたした。

モヌタヌは盞互に鏡像関係にあるため、モヌタヌの1぀はモヌタヌに向かうワむダも亀換したす。 もちろん、この゜フトりェアを実行できたすが、より快適なアむロンです。



これで、サヌバヌは垞にシャフトがちょうど真ん䞭にあるず芋なしたす。 そしお、デュヌティサむクルが平均よりも倧きいPWM信号を䞎えるず、出力シャフトは䞀方の方向に回転し始め、もう䞀方の方向に回転し始めたす。 そしお、䟛絊された倀が平均からより匷いほど、シャフトはより速く回転したす。



テストずファクアップ




顧客がプロトタむプデバむスをテストする



䞊蚘のデバむスのビデオず写真をすでに瀺したので、このセクションでは䞻に、螏んだレヌキのテキストによる説明を含みたす。 それらのいく぀かは私のせいで発生し、いく぀かは私に䟝存したせんでした。



ファックス駆動


スキヌムで最も改善された最初の事実。 ブヌストコンバヌタヌず接続されおいたす。 デバむスを最初に起動したずきこれたでのずころドラむブなし、䜕も気付かず、コントロヌラヌが巻き䞊げられお点滅したした。 5Bはコンバヌタヌの出力にありたした。 ドラむブをチェックする時が来たした。ここで熊手が出たした。 ドラむブが接続されるず、コンバヌタヌは即座に切断されたした-内蔵保護がトリガヌされ、出力電圧が指定倀5Vを10以䞊䞋回るず、マむクロ回路が無効になりたす。 デバッグには、オシロスコヌプに座ったり、コンバヌタヌチップ自䜓を同様のものに亀換したり、異なるチョヌクをテストしたりするなど、非垞に長い時間がかかりたした。

興味深いこずに、ドラむブの近くにある容量でさえも助けにはならなかったので、問題はボヌドの配線たたはスロットルにあるず刀断したした。 枬定により、負荷が90 mAを超えるず、玔粋な抵抗負荷の堎合でも、コンバヌタは動䜜を停止するこずが瀺されたした。 さらに、効率は玄40パヌセントでした。もちろん、むンパルスコンバヌタヌの堎合、これは受け入れられたせん。



その理由は非垞に平凡であるこずが刀明したした-10ÎŒFの出力セラミックコンデンサの代わりに、1ÎŒFで誀っお同じものをはんだ付けしたようです。 このような出力容量では、マむクロ回路はモヌドに入るこずができず、ノズルに取り付けられた倧きなコンデンサは圌女をたったく助けたせんでした。

ボヌドをマスクから軜く掗浄した埌、2぀の22マむクロファラッドのセラミックコンデンサをコンバヌタヌの出力、その入力、およびサヌバヌの正面にはんだ付けしたした。

同時に、2A甚に蚭蚈されたコンバヌタ出力ずサヌボBLM41PG471SN1の間に平滑むンダクタより正確にはフェラむトビヌズを取り付けたした。

さらに、ボヌド䞊の堎所から、コンバヌタヌ出力のすぐ隣にある150マむクロファラッドで、「A」ケヌスに1぀のタンタルコンデンサヌを抌し蟌むこずができたす。

実際、正垞に動䜜するには、出力に1個、入力に1個の22マむクロファラッドコンデンサで十分ですが、堎所が蚱されたので、安党にプレむするこずにしたした。

結果は単玔に優れおおり、負荷がかかっおいおも5V出力はほずんどノむズが倚く、枬定倀入力および出力回路に電流蚈を含めたによるコンバヌタヌの効率は93パヌセントに達し、それ自䜓が非垞に良い指暙です。



たずめからの結論ボヌドにはんだ付けする芁玠を確認したす。 パルスコンバヌタヌは敏感で、思考の方向出力容量が䞍十分が正しい堎合でも、ノズルに取り付けられたコンポヌネントは状況を改善したせん。

プロヌブの抵抗ずマルチメヌタヌのシャント、モックアップの静電容量ずむンダクタンスは画像を歪めるため、錻ではなく最終構成でそのようなこずをテストする必芁がありたす。



加速床蚈によるファックスアップ


䞍泚意によるHe栞の停装。 呚蟺機噚をテストするず、加速床蚈が応答しないこずが刀明したした。 なぜなら 圌はI2Cバスに座っお、デバむスアドレスの送信で通信を開始したす開始パルスはカりントしたせん。 その埌、アドレスが䞀臎する堎合、確認パルスで応答する必芁がありたす。 衝動はありたせんでした。

加速床蚈のケヌスははんだ付けに最も悪かったので3x3 mmで、マむクロサヌキットに「アヌス」プラットフォヌムはありたせんでしたが、それはうんざりするほど䞭心にあったため、はんだ付けに問題があるず刀断し、䜕床もはんだ付けしたした。 助けにはなりたせんでした

その埌、玄束された内蔵抵抗噚では䞍十分であるず刀断し、ボヌドを掗浄しお鉱山をはんだ付けしたした。 助けにはなりたせんでした

コヌドを䜕床も確認し、デヌタシヌトで䜏所を確認したした。 助けにはなりたせんでした

その結果、ある奇跡によっお、圌は1぀ず぀アドレスのバむナリ衚珟のビットの1぀でセットずは異なるアドレスを䞎えたした。 助けた。

デバむスが別のアドレスに応答するために、これが䞍可胜なため、デヌタシヌトを掘り始めたした。 そしお玠晎らしいこずを芋぀けたした。

加速床蚈には、 LIS331DLずLIS331DLHの 2぀の倉曎がありたす。

同じ䜏宅。 同䞀のデヌタシヌト。 同じレゞスタマップ。 単玔な2秒目では2g / 4g / 8gではなく、最初の2g / 4gしか枬定できたせん。

そしお、それらのアドレスは1぀異なりたす。 良いGoogle、LIS133を入力し始めたずき、自動的に "LIS133DLH"に促されたしたが、すぐにデヌタシヌトの違いが芋えなかったので、他の人の䜏所でアクセルを非難したした。



fac-upからの結論デヌタシヌトの芁玠名を確認しおください 予想されるものず少なくずも1文字異なる堎合は、この文字の原因を確認しおください。 ほずんどの堎合、末尟の文字は開発にずっお重芁ではなく、コンポヌネントの配信の皮類に関連しおいたすが、この加速床蚈でも発生したす。



Bluetoothモゞュヌルを䜿甚したファックスアップ


よく、このphak-upは䞭囜人の良心により倚くありたす。 HC-04、HC-05、HC-06、このモゞュヌルのいく぀かの倉曎を生成するこずが刀明したした-それらは鉄が異ならず、ファヌムりェアが異なりたす。 必芁に応じお、別のものを倉曎できたす。

HC-04はHC-05の代わりに私に来たした。04のほうがファヌムりェアが簡単で、05がGPIOの1぀に信号を適甚するこずでコマンドモヌドに切り替えられ、05がマスタヌたたはスレヌブずしお機胜できる堎合、04は垞に異なりたす。スレヌブずしおのみ機胜したすたたはマスタヌずしおのみ機胜したすが、販売䞭のモゞュヌルはただ芋おいたせん。最初はコマンドを受信するモヌドであり、マスタヌずの通信を確立した埌、コマンドぞの応答を停止したす。

さらに、これらのモゞュヌルはいずれも゚ネルギヌ効率の高いスリヌプをサポヌトしおいたせん。

したがっお、モゞュヌルをコマンドモヌドにするために私から持っおきた信号は圹に立たず、たた、マスタヌを探しおいる間、モゞュヌルは垞に20〜40 mAを消費しおいるこずがわかりたした。

解決策は、この状況では圹に立たない制埡信号をRESETモゞュヌルのピンに投げるこずでした。 ここで、䜎レベルがそこに適甚されるず、モゞュヌルはRESET状態になり、消費を停止したす。



たずめからの結論東掋は埮劙な問題です。 䞭囜のモゞュヌルは宝くじです。デヌタシヌトを泚意深く読み、それらがあなたに送信するものも確認しおください。



デバッグむンタヌフェむスを䜿甚したFAXアップ


その事実ではなく、怜蚎のための情報。 はい、ファヌムりェアずデバッグには、実際には2぀のSWD信号ピンクロックずデヌタで十分です。 ただし、 VAPPプログラマピンがコントロヌラヌの電源に盎接接続されおいない堎合は、たったく方法がありたせんいずれの堎合もST-LINK。 プログラマヌは圌らのために電圧をテストしたすが、䞀般的に圌にはやさしいです。䜕らかの理由で、それを3.3Vの電源に閉じおも機胜したせんでした。 ただし、これはそれほど怖いものではありたせん。スムヌゞングコンダヌの1぀にはんだ付けされおいたす。

他よりもはるかに悪い。 もちろん、コントロヌラヌのリセットを担圓するNRSTピンがありたす。 実際、SWDはコントロヌラヌ゜フトりェアをリセットできるため、原則ずしお、接続するこずはできたせん。 しかし。

スリヌプモヌドをテストするず、すくいが忍び寄っおきたした。 残念ながら、 䜎電力モヌドのデバッグサポヌトセクションであるCTM32 refmanからこれらの重芁な甚語を読みたせんでした。デバッグセッション䞭にコアでFCLKたたはHCLKをオフにするこずはできたせん。 これらはデバッガヌ接続に必芁なので、デバッグ䞭はアクティブのたたにしおおく必芁がありたす。

最も深いスリヌプ、スタンバむモヌドでは、デバッグず共にタむミングが無効になりたす。 そしお以来 消費テストのために、メむンのスタンバむぞの入り口に入ったずころ、最埌に非瞫補コントロヌラヌを入手したした。

rezetずこの事実の間の接続は簡単です-スタンバむがただアクティブになっおいないずきにプログラマヌはrezetの䞋から瞫うこずができたすそしお、ファヌムりェアでオンにするずすぐにアクティブになりたす、これのためにのみ、 NRSTピンなしでコントロヌラヌを再起動できたす圌はできたせんでした。

奇劙に思えるかもしれたせんが、プログラマヌが絶えずプログラマブルコントロヌラヌを怜出しようずする壮倧な自動モヌドがあったSTの暙準ナヌティリティは私を救っおくれたした。 このモヌドをオンにしお、GNDを針にはんだ付けしお配線を開始し、コントロヌラヌの䞋からかろうじお突き出おいる切断領域を突くようにしたした。 プログラマヌがコントロヌラヌを拟い䞊げおから再び眠りに萜ち、ファヌムりェアを消去するこずができたした。



たずめからの結論眠っお、どうやっお目芚めるかを考えおください。 たあ、あなたは針を刺すこずさえできるように、少なくずも䜓から1ミリメヌトル離れたカットを衚瀺する必芁がありたす。



ドラむブでFAXを送信


最も悲しい事実であり、それは私の良心ではありたせん。 ドラむブ、申し蚳ありたせんが、たわごず。 サヌボモヌド専甚に蚭蚈されおいるため、ほずんどの時間を静的な䜍眮で過ごすこずができたす。 負荷がかかるず、圌らは容赊なく济したす。 さらに、䜕も取り付けられおいなくおも加熱され、シャフトが回転するだけです。 そのため、䞀定回転モヌドでは動䜜したせん。2分埌、速床が䜎䞋し、内郚の最滑性が優れおいおもスティックがなく、ストロヌクがスムヌズ、自然に溶け始めたす。



䜓が溶け、そしお䜕より最悪なのはギア、特に出力です。 その埌、ドラむブがくさび状になり、亀換のみが圹立ちたす。 そのため、写真ずビデオに衚瀺されおいる圢匏の猫ボットは、䞭断されお1〜2分間しか機胜したせん。 そのため、私はそれを分解し、ドラむブを、より長く、ゆっくりず回転する金属ギアを備えた、より健康的で、より遅く、よりガズリングするMG90に亀換しなければなりたせんでした。

そのため、圌はボヌルに収たらず小さなボヌルはもちろん倧きなボヌルにも、非垞にゆっくりず走りたす。

しかし、コツはただ面癜いです。



事実からの結論さお、どのような結論が埗られるのか、それはテストサンプルであり、そのようなこずを明らかにするだけです。 ドラむブに関する結論-小さなドラむブは现心の泚意を払っお䜿甚しおください。おそらく圌らは超軜量で超埮现な六角圢たたは四足動物を匕っ匵るでしょう、私は時間があるずきにそれを集めようずしたす。



䜜業に関する䞀般的な結論䞀般的に、経隓は圹に立ちたす。そしお、猫は、新しいボットがキャットボットのサむズず速床が遅くなったにもかかわらず、それを気に入っおいたす。特に圌がきしむずき

そのようなこずを収集しおいる人にずっお、もう1぀蚀えるこずです-回転センサヌアクセルは適甚されたせんは必須です。なぜなら、キャリブレヌションず䞀定の倀がないず、2぀の異なるドラむブずホむヌルの同じ速床を達成するこずは䞍可胜だからですしたがっお、ロボットは茪になりたす。キャリブレヌションが良奜な堎合-非垞に倧きな円の呚りにあるため、これは壁から壁ぞ移動する堎合にのみ顕著になりたす。悪い堎合は、かなり早くなりたす。そのため、次のバヌゞョンでは、より耇雑なセンサヌを蚭眮する予定です。もちろん、より適切なドラむブです。

小さいドラむブでモヌタヌの冷华を敎理しようずする考えはただありたすが、速床を萜ずすこずで正しい動䜜に十分な堎合がありたす珟圚、それらからのヒヌトシンクは嫌です。うたくいけば、冷华ドラむブずFreeRTOSに関するcat-bot v1.5に関する次の蚘事を埅っおください



ロボットを集めお、コテを楜したせおくれたす

画像







All Articles