問題タブ [accelerometer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++は「このスコープで宣言されていません」コンパイルエラーと変更のヒント
Arduino Megaで動作するように、このコードを変更しようとしています。私はCにかなり慣れていないので、いくつかの大きな間違いを犯した可能性があります。ちなみに、これはバランススクーター用です。:P
このコードはATmega32から取得されます(from:[url = http://sites.google.com/site/onewheeledselfbalancing/Home/twin-wheel-self-balancing-skateboard-lightweight-version/code4 ] http:// sites .google.com / site / onewheeledsel ... t-version / code4[/url] そして私はそれをArduinoMegaで動作させようとしています。
このコードはATmega32開発ボード用に書かれました http://www.active-robots.com/products/controllr/m32db.shtml
ありがとうございました!
これが私が遭遇する最初のエラーです:
関数'voidtimer_init()':エラー:'TCCR0'はこのスコープで宣言されていません関数'int main()':
誰かが私に何が悪いのか説明してもらえますか?私はプログラミングの初心者ですが、たくさんの本やウェブサイトを読んだことがあり、私も速く学んでいます!^^そしてここに完全なコードがあります(かなり長いです):
CLOCK_SPEED16000000を定義します
OCR1_MAX1023を定義します
typedef unsigned char u8; void set_motor_idle(void); void InitPorts(void); フロートレベル=0; float Throttle_pedal; フロートaa; フロートアクセラウ; float x_acc; フロートアキュム; float x_accdeg;
フロートジャイロサム;
float gangleratedeg; フロートgangleraterads; float ti = 2.2;
フロート全体ゲイン; フロートゲインコントロール; フロートバッテリーボルト=24; フロートジャイロアングルdt; フロート角度; フロートアングルラッド; float balance_torque; フロートソフトスタート;
float cur_speed; float cycle_time = 0.0064; float Balance_point; float a0、a1、a2、a3、a4、a5、a6;//加速度計のSavitzky-Golay変数
int i; int j; int tipstart; void InitPorts(void){PORTC = 0x00; // DDRC = 0xFFで開始するためにポートCプルアップを低(出力電圧なし)に設定。//ポートCピンはすべてポートC方向レジスタを介して出力として設定されます//PORTC| =(1 <
DDRA = 0x00; //入力として設定されたすべてのポートAピンPORTA=0x00; //ポートAの入力プルアップが低プルアップに設定されている
DDRD = 0xFF; // OCR1A(PinD5)およびOCR1B(Pin D4)が正しく機能するための前提条件として、すべてのポートDピンを出力として構成します
PORTB = 0x00; //ポートBのプルアップを低(出力電圧なし)に設定して、DDRB=0xFFで開始します。//すべてのポートBピンを出力に設定
} / * IO:外部水晶クロックでATMega3216MHzを使用しています。OSMCモーターコントローラーPC4オンボードLEDPD5/ OC1AALI->OSMCピン6PD4/ OC1BBLI->OSMCピン8PC1無効->OSMCピン4PC2BHI->OSMCピン7PC3AHI->OSMCピン5への新しい計画されたピン配置PA6 / ADC6 Vbatt /10->OSMCピン3PA1/ADC1ピッチレートジャイロPA0/ADC0加速度計 /voidadc_init(void){//使用しないのでアナログコンパレータをオフにする /ACSR =(1 << ACD); / PA0 / ADMUX=0を選択します。ADMUX | =(1 <ADCプリスケーラを128に設定し、ADCを有効にして、変換を開始します/ ADCSRA = 0 |(1</偽の最初の変換が終了するまで待ちます*/ while(ADCSRA&(1 <<
uint16_t adc_read(uint8_t channel){
/*チャネルを選択/ADMUX=チャネル; ADMUX | =(1<変換の開始/
ADCSRA | =(1 << ADSC);/変換が終了するまで待つ/while(ADCSRA&(1 << ADSC)){}/結果を返す*/ADCWを返す;}/ * 156サイクル/秒、6.4ms/サイクルOSCILLOSCOPEで測定*/ / *すべてのADC入力を読み取り、変換を実行* / void sample_inputs(void){
=(float)adc0; for(j = 0; j <7; j ++){adc1 = adc_read(1); //ジャイロピンPA1gyrosum=(float)gyrosum + adc1; //ジャイロのループごとに平均7つのサンプルを使用して、プログラムの各ループで完全な更新を取得します}
位置PA2*/ adc3 = adc_read(3); /*ポジションレバーを引き戻した位置PA3*/ adc4 = adc_read(4); /*Throttle_pedalの位置PA4*/ adc5 = adc_read(5); /*位置レバーを前方に押して位置PA5*/ // adc6 = adc_read(6); / * OSMCからのVbatt入力(現在は使用されていません)位置PA6 *///加速のみのSavGolayフィルターa0=a1; a1 = a2; a2 = a3; a3 = a4; a4 = a5; a5 = a6; a6 =(float)accelraw; accsum =(float)((-2 * a0)+(3 * a1)+(6 * a2)+(7 * a3)+(6 * a4)+(3 * a5)+(-2 * a6)) / 21; //SavGolayの計算
//電圧スパイクを滑らかにし、範囲を0〜3にしますThrottle_pedal =(float)Throttle_pedal * 0.9 + 0.1 * adc4 / 341; //電圧スパイクを滑らかにし、範囲を0〜3にします
//デッドマンボタンが離された場合にモーターをカットします//(gaincontrol変数もこのボタンを介してadc2に配線されますif(adc2 <100){Throttle_pedal = 0.001; gaincontrol = 0.001;} totalgain = gaincontrol * softstart; //レバーが後ろに引っ張られたり、前に押されたり、何もしなかった場合の対処方法:Balance_point = 514; if(adc3> 100)Balance_point = 534;
if(adc5> 100)Balance_point = 494;
オシロスコープでループ時間を測定する
/ ACCELEROMETER信号処理//オフセットの減算/ x_acc=(float)accsum-Balance_point; // accsumは加速度計のSG値であり、真の「合計」ではないため、7で割る必要はありませんif(x_acc <-250)x_acc = -250; //加速値を-250〜 + 250の範囲に制限します(片道80度傾斜)if(x_acc> 250)x_acc = 250; / *加速度計の角度変化は、0〜30度(正弦波)の範囲で1度の傾斜あたり約3.45単位です。傾斜を加速度センサーからの傾斜度に変換します。正弦角=おおよそ=小さな角度の角度なので、三角法を実行する必要はありません。以下のx_accはDEGREES*/になりました
x_accdeg =(float)x_acc / -3.45; //マイナス記号は、後ろから前への加速度計の取り付けを修正します!
つまり、必要なゼロ点は、読み取り値から512*/を引いた値になります。
/データシートからの毎秒20mVのジャイロ角度の変化は毎秒4.096単位(0〜1023のスケールで)の変化を与えます角度の変化これはジャイロ角度の変化率を最大速度よりわずかに小さく制限します実際に測定可能(100度/秒)。これらの小数部はすべて、PWMジェネレーターに送信される直前に整数に切り上げられ、PWMジェネレーターはモーターコントローラーに接続されます/ gangleratedeg =(float)((gyrosum / 7)-508)/4.096; //ジャイロサムは7つのサンプルのグループの合計であるため、ジャイロ値を7で割るとif(gangleratedeg <-92)gangleratedeg = -92; if(gangleratedeg
92)gangleratedeg = 92 /メインプログラムサイクルごとに1回ポートB2のオンとオフを切り替えて、オシロスコープを接続してプログラムサイクルタイムを計算できるようにします。サイクルタイムを使用して、サイクルごとのジャイロ角度の変化を計算します。この時間間隔の長さを知る/PORTB&=(0 <
/ tiは、「i」または積分係数(現在は2.2)のスケーリングを表します。ジャイロアングルdtは、ジャイロセンサーからの度数で表した最後のCYCLE以降の角度変化です。ここで、tiはスケーリング係数です(理論的には約1である必要がありますが、2.2はボードをよりタイトに感じさせます
)現在、度/秒の単位でaaは時定数を変化させます。つまり、aa値が小さいほど、ジャイロドリフトをゆっくりと補正するため、加速度計の時定数が長くなります。aa = 0.005; gyroangledt =(float)ti cycle_time gangleratedeg;
gangleraterads =(float)gangleratedeg * 0.017453;/ DEGREESの新しい角度は、古い角度に最後のサイクル以降のジャイロからの角度の変化を加えたもので、新しい加速度の読み取り値が少し考慮されています/ angle =(float)((1-aa)*(angle + gyroangledt))+(aa * x_accdeg ); //主な角度計算関数*///角度を度からラジアンに変換
+(0.5 * gangleraterads);
cur_speed =(float)(cur_speed +(Throttle_pedal * balance_torque * cycle_time))* 0.999;
/ *レベル値は-1から+1で、モーターに送信されるデューティサイクルを表します。ラジアンに変換すると、これらの制限内にとどまることができます。レベル=(balance_torque + cur_speed)*全体的なゲイン;
}
void timer_init(){TCCR0 = 0 | (1 <
//PWMモードは「PWM、位相補正、10ビット」ですTCCR1A = 0 | (1 <
(1 <
void set_motor()
/ * leveli項は、OSMCに接続されているPWMモーター制御ポートに送信する準備ができている整数として-1023から+1023に再スケーリングされたレベル項です* / {
// if(level <-0.9)level = -0.9;//適切な制限内にあることを確認します//if(level> 0.9)level = 0.9;
int16_t leveli =(int16_t)(level * 1023); //ここで、「level」の浮動小数点値を取得し、それを1023で乗算してから整数にした後、値を「leveli」としてPWMジェネレーターにフィードします。
if(leveli <-1020)leveli =-1020; //(leveli> 1020)leveli = 1020;の場合、ボードから突然スローされたくないので、適切なPWM制限内にあることを再確認します。
/ポートB1にLEDまたはブザーを設定して、供給されるトルクが可能な最大値の50%を超える場合は、速度を落とすように警告します。この理由は、速度で前方に転倒し始めた場合に備えて、常に予備のモーター電力が必要になるためです。モーターはすでにフラットアウトで動作しているので、高速で転倒する可能性があります。自動チップバックルーチンを使用して、最高速度を自動的に制限するものもあります。今のところ私はこのように簡単にやります/
if(level <-0.7 || level> 0.7){
PORTB | =(1 <PORTB&=(0 <softstart =(float)softstart + 0.001; if(softstart> 1.0)softstart = 1.0;
OSMCが機能し、両方がOFFになってモーターがシャットダウンする/ *注:理由はわかりませんが、AHIとBHIを+12Vに配線するために最後に行った方向変更でモーターの切断を停止する//PinC1を設定してOSMCを無効にしない出力をゼロにすると、1はOSMC * / PORTC |=0x0cを無効にします。// C1をプルダウンして、OSMCの無効化を解除します。つまり、有効にします。PORTC&=〜0x02; //無効はオフですif(leveli <0){OCR1A = -leveli; // leveli変数は負の符号付きの値であるため、ALIはPWMで逆方向に進みます。ここでは、マイナス記号を保持してください。OCR1B = 0; // BLI = 0} else {OCR1A = 0; // leveli変数は正の符号付きの値であるため、ALI=0以降OCR1B=leveli; //BLIはPWMです}}
int main(void){InitPorts();
adc_init();
timer_init();
/ *初期傾斜開始コードボードを片側に傾けた状態でマイクロをオンにします。傾斜角度がゼロ(中間)ポイントバランスアルゴリズムを超えると、ライダーはマイクロをオンにします。それ以外の場合は、水平位置に傾斜するまでこのループに永久にロックされます。ライダーがボードに乗るとき*/tipstart = 0; accelraw = 0;
while(tipstart <1){
//これは、accsumの値を確認する前に、最初にマシンの電源を入れたときにSGフィルターが適切な安定した値になるようにするために必要です(以下)。
for(i = 0; i <20; i ++){
sample_inputs();
}if(accsum <504 || accsum> 524){//
if(x_accdeg> 0){tipstart = 0; } else {tipstart = 1;
softstart = 0.4; }}角度=0; cur_speed = 0; /*チルト開始コードの終わり。このポイントを超えると、マシンは水平になり、アクティブになります* /
sei();
while(1){sample_inputs();
set_motor();
}}
c - AVR ATmega32 と Arduino Mega のコーディングの主な違いは何ですか?
Arduino Megaで動作させるために、このコードを変更しようとしています。私はCにかなり慣れていないので、いくつかの大きな間違いを犯した可能性があります。ちなみに、これはセルフバランススケートボード用です。
このコードは ATmega32 (ここから) から取得したもので、Arduino Mega で動作させようとしています。
このコードはATmega32 開発ボード用に書かれています。
私はいくつかの変更を行いました(いくつかの間違いを修正しました)が、最後に遭遇しました:
関数 'int main()':
エラー: 'int main() の再定義
完全なコードは次のとおりです。
iphone - iPhoneSDKを介した速度の測定
電話の速度を測定するためにネイティブのiPhoneアプリ(基本的にはスピードメーター)を実装する必要があります。CoreLocation APIを介してこれを行うのはかなり簡単ですが、これは一度に最大2時間使用できるリアルタイムの測定であるため、バッテリーの消費量が心配です。私の理解では、LocationManagerからのイベントを積極的に監視している間(実際にはGPSの位置は気にしませんが)、バッテリーを大量に消費します。
探索する他の明白なオプションは、加速度計を使用して速度を計算することですが、APIにはそれを支援するものは何もありません。私の調査によると、これは可能であるはずですが、非常に複雑でエラーが発生しやすいようです。加速度から速度への変換は、最初は難しい場合があります。さらに、iPhoneの加速度計データは「ノイズが多い」場合があります。ローパス/ハイパスフィルタリングなどの使用を示すSDKの例はよく知っていますが、速度の計算を示す良い例はどこにも見当たりません。
誰かがこれを共有できる実際の経験を持っていますか?コードは素晴らしいでしょうが、本当に私は誰かがこれを(長寿命のアプリのために)うまくやったかどうか、そして彼らがどのようなアプローチをとったかを知りたいだけです。
編集:LocationManagerAPIを使用する実用的なプロトタイプがあります。正常に動作しますが、更新サイクルは速度のリアルタイム測定には理想的とは言えません。状況によっては、更新に最大4〜5秒かかる場合があります。特定の速度でのクルージングは問題なく機能する傾向がありますが、ユーザーの操作の観点からは、加速/減速は非常に遅れる傾向があります。また、私が行っている他のいくつかの計算に速度を供給する必要があり、精度は実際には必要なものではありません。
私が見た他の(ごく少数の)アプリ、特にGPSを使用しないと主張しているが速度を正確に計算するgMeterに基づいて可能であるように思われます。私が見つけることができるどこにもこれを示す参照やサンプルコードがないことに本当に驚いています。複雑だとは思いますが、確かに何かがあります。
iphone - PhoneGap 0.8 でシェイク ジェスチャを検出するにはどうすればよいですか?
PhoneGap 0.8 を使用していますが、基本的なシェイク ジェスチャを検出したいと考えています。関連する 2 つのスニペットを見つけました。
http://groups.google.com/group/phonegap/browse_thread/thread/25178468b8eb9e9f
http://phonegap.pbworks.com/Handling-Shake-Events
どちらも私のために働いていません。残念ながら、ドキュメントは少し古くなっているようで、PhoneGap の API リファレンスは単なるテスト集です。私はそれができることを知っていますが、既知の適切な出発点がありません。
誰かが PhoneGap の短い振動検出コードのスニペットを提供してくれれば、彼らが彼らのために働くことを知っています. 御時間ありがとうございます!
iphone - Titanium for iPhone でスリープを防止する
加速度計を長時間 (1 ~ 2 時間) 読み取ろうとしています。
ただし、iPhone がスリープ状態になってロックされると、加速度計の読み取りが一時停止します。
私のsetIntervalタイマーは正常に動作しているようです。音も出せます。
私は2つの解決策を見ます
a) ロック中に加速度計を読み取る方法を見つける b) ロックを防止する方法を見つける
私は JavaScript で Titanium を使用しています。
ios - iPhoneの加速度計機能を使って歩きながら歩数をカウントするロジック
iPhone の加速度計機能を使用して、歩行中の距離を計算するにはどうすればよいですか?
iphone - Iphone-SDK: 加速度計 x、z から 360 度?
加速度計によって生成された x、z 値を取得し、それを iphone 回転の 360 度のポイントを表す値として変換するにはどうすればよいですか? (LANDSCAPED) iPhone の回転全体の値を表す限り、-2 から 2 (中間点の場合は 0) まで、0 から 360 までの値を指定できます。
その場合の最善の解決策は何ですか?
iphone - 左右の動きを検出する加速度計
iPhoneが左に動いているか右に動いているかを検出する方法の例を教えてください。シェイクの長いバージョンのように、ユーザーの腕が右に向いているか左に向いているかをアプリで認識できるようにします。最後に携帯電話を持った窓拭きのような手を想像してみてください
何か案は?
ありがとう、サム :P
iphone - iPhoneの回転スピンを検出しますか?
ユーザーがiPhoneデバイスを回転させたときにスピンの数を検出できるアプリケーションを作成したいと思います。現在、私は Compass API を使用して角度を取得し、スピンを検出するさまざまな方法を試しています。以下は私が試した解決策のリストです: 1/ コンパスから取得した角度がそれらを通過したかどうかを検出するために、フルラウンドに 2 つの角度トラップ (フルラウンドのピース) を作成します。2/ コンパスが更新される時間の間のすべての角度距離を合計します (updateHeading 関数で)。合計角度を 360 に分割してみましょう => スピン数を取得できます
問題は、電話の回転が速すぎると、コンパスが電話の速度に追いつかず、最新の時間で角度を返します (実際の回転のように連続的ではありません)。
また、加速度計を使用してスピンを検出しようとしています。ただし、平面上で電話を回転させると、この方法は機能しません。
この問題に関する解決策または経験があれば、私を助けてください。
本当にありがとう。
iphone - iPhone加速度計のキャリブレーション
iPhoneゲームの加速度計を適切に調整するにはどうすればよいですか?現在、電話が平らな面にあるとき、パドルは左にドリフトします。ハイパスフィルターまたはローパスフィルターは、低い値と高い値でもパドルを完全に制御する必要があるため、許容できるソリューションではありません。AppleがBubbleLevelサンプルを持っていることは知っていますが、フォローするのは難しいと思います...誰かがプロセスを単純化できますか?
私の加速度計コードは次のようになります。
ありがとうございました!