• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

たぽのブログ一覧

2024年01月14日 イイね!

ALTにリベンジに行ったが、使い古したCR-Sで返り討ち

ALTにリベンジに行ったが、使い古したCR-Sで返り討ち



シバタイヤの新TW200の冷えやすさに見事に足元をすくわれた走り初めを踏まえ、フロントの255のA052とバランスの取れるリヤタイヤを求めて、素直に225/45R17のA052を注文したらまさかの廃番!Σ( ̄ロ ̄lll)





そんなにマニアックなサイズでもないと思うんだけど、もしかしてA052、世代交代か!?





さてどうしたものか。次に手堅そうなのはRE-71RSだろうけど、クムホがいつの間にかV730なんてのを出してたので、V700で楽しかったのを思い出して、V730(225/45R17)を注文!





そしたら今度は、国内在庫切れで本国での生産予定も未定、当然日本への入荷も未定とか言われた。_| ̄|○





この週末、気温低めで天気も良さそうだし、1/15(月)に鈴鹿を走ろうと思って休みも取っていたので、それまでに何とかタイヤを間に合わせたかったんだけどなあ。





しょうがないので、手持ちのタイヤの中ではマトモそうなCR-Sを投入してみることにした。一応、11月下旬にフロントに履いて30.2が出てたので、リアならまだイケるはず、と言う予想。





しかし、今朝のALTのTwtterを見たらうっすら(と言うかまばらに?)雪化粧…。今シーズンは朝一アタックは無理だな。(´・ω・`)





と言うわけで、手堅く午後狙いで12時過ぎにALTに到着すると、駐車場は上の画像の通り所々雪。コース上は見たところドライっぽいけどどうだろうなあー。ちょっとよく分からなかったので14時枠にエントリーした。





で、のんびり準備をしてると、駐車場の雪を見て「心折れた」とか言ってた相棒さんが、なんか急にやる気になったらしく、ドアの内張まで剥がし始めた(笑







そんな感じで気合を入れて、14時枠で走り始めてみると、レコードラインはほぼドライで気温も低めでコンディションは結構良さげ♪





しかし、リアのCR-Sが全然温まらない。シバ200のがまだマシだった。_| ̄|○





ずーっとドリドリしてるので、今日の動画はコースインから16, 7周走り倒してるのを丸ごと公開。一応チャプターは入れてるので、ベストラップとかかいつまんでみたい人はチャプターで飛ばしてくれ。あ、ベストはこの動画の最後のラップ(動画中の表示で17周目)に出した30.168だった。







リアを温めるために、中盤はタイトコーナーで意図的にリアを振り回してたけど、FFで山頂や最終コーナーで振り回すのなんていつ以来だ??ちょっと楽しくなっちゃった。





でも、1,2コーナーや3コーナーでリアがイマイチ頼りないので、前回と同じくフロントのグリップが余ってる感じ。むしろ温まってからのグリップも新品シバ200のが上だったようなので、今日のタイヤは完全に失敗。orz





相棒さんもこんな感じ(笑







いやー、キビシー。明日の鈴鹿どうすっかなあ。





家に帰ってから、試しに255のA052をリアにはめてみたら、車高調にムニュっと干渉。BRZのフロントに入れてた3mmのスペーサを入れてもこの状態。orz







キャンバーボルトで起こせばギリギリ逃げれそうな気もするけど、そうするとフェンダー側が当たりそう…。アームを縮めてやれば収められるとは思うけど、そこまでするか??うーん・・・。





ていうか、いつの間にかショックの錆が酷いな。。。(´・ω・`)





それにしてもALT 3枠でタイヤ減ったなぁ…。左から新品A052 255/40R17、ALTで3枠使ったA052 255/40R17、今日リアに履いたCR-S 225/45R17。うーむ、リアのキャンバー足りてないのかな(右が内側)。







まあいいや。CR-Sは外側の溝は無くなってるしグリップもしなかったから処分することにして、RE-71RSでもポチって、明日はゴロゴロしてよかな。(´・ω・`)


Posted at 2024/01/15 00:26:10 | コメント(0) | トラックバック(0) | オートランド作手 | クルマ
2024年01月05日 イイね!

冬のFFにA052+シバ新200の組合せは凶悪

冬のFFにA052+シバ新200の組合せは凶悪


当初は昨日の午後イチに走るつもりだったけど、なんかまだ路面濡れてたので出直してきて、改めて今日の夕方、ALTで走り初めだ(最近は朝イチは霜が溶けて濡れててダメだな)。





と言うわけで、タイヤよし!(フロント新品A052 255/40R17+リア新品シバタイヤ新TW200 225/45R17)、軽量化ヨシ!(天井内張も剥がした!)、アバラよし!





てな感じで15:00枠に滑り込んで、NEWタイヤでベスト更新しちゃるぜ!と意気込んでみたのだけど、この組み合わせは非常に凶悪だった。_| ̄|○









シバタイヤのTW200は温まりにくいとは聞いていたのである程度は覚悟してたけど、そうは言っても、かつてそう言われていたV700でもそんなに危ないとは感じなかったので大丈夫だろうと高を括ってたんだけど、今回のはマジでヤバかった。





初っ端のコースイン直後は前後ともに冷えてるので慎重にペースを上げて、確かにリアがなかなか食わないな、とは思ったけど、徐々に温まって結構振り回し気味に走ってもしっかりグリップするようになって、6周目に29.767が出てそれがこの日のベスト(一応プレミアム3枚目のタイムはクリアしたが、自己ベストは更新できず)。





しかし問題は、ピットに戻ってひと息入れるだけですぐにリヤタイヤが冷えちゃって、すっぽ抜けちゃうこと。





「しっかりグリップするから思い切って行ってこい!」と相棒さんを送り出したら、3コーナーで見事にスピンw





あれー?ちゃんとグリップしたはずなんだけど、最初のドリドリを味わったせいで無意識に荷重移動を手加減してたのかなあ、と疑問に思いつつ、相棒さんの後でもう一度俺が走ってみたら、「おっふ、ピットで5分休んだだけでタイヤ冷えてドリドリになっとる((((;゚Д゚))))」







温まればちゃんとグリップするのに冷えてるとツルンツルンっていうこのピーキーな特性が、すぐに安定したハイグリップを発揮するフロントのA052との相性が最悪だ。リアのグリップが来てるかどうか探りながら走ることになるので、思い切ってオーバースピードでコーナーに飛び込むことができない…。_| ̄|○





昔のSタイヤってこんな感じだったのかな。なんか温まるまで全然食わんらしいじゃん。使ったことないけど。





悔しいので16時枠もオカワリしたんだけど、俺も見事にスピンした。割と早めに反応できたと思うんだけど、フルカウンター状態でもまだリアの流れるのが速くて立て直せなかった…。









温まればちゃんとグリップするので、相棒さんも自己ベストを更新してたけど、目標タイムには一歩及ばず。





さて、そんな訳で俺はバッジタイム(プレミアム3枚目)はクリアできたけどベストは更新できず、相棒さんはベスト更新&ノーマルバッチ2枚目クリアだけど目標タイムはクリアできなかったので、ランキングやALTバッジのエントリーはお預け。さっさと本命リヤタイヤを調達してリベンジに行かないとな。





最後に、ベストラップと今回のドリドリ大全集動画。あえてピットアウトから早送りでつなげて、いかにピットアウト直後にヤベーかを表現してみたが、、、相棒さんからは「分かりにくい」とバッサリ。orz







オマケ。昨日のALTからの帰りに、ランチタイム終了間際に並んだラーメン屋に、今日は晩飯タイム開始直後(?)に2日続けて入店。今日はすいてた。うむ、アッサリ系だけどうまし。





Posted at 2024/01/06 16:02:02 | コメント(0) | トラックバック(0) | オートランド作手 | クルマ
2024年01月02日 イイね!

ハンコンラジコンの雑な解説

ハンコンラジコンの雑な解説

新年早々地震やら飛行機事故やらヤベー映像が飛び込んでくるけど、我が家は平常運転。今年もよろしく。





以前にも書いた気がするけど、なぜか俺のYouTubeチャンネルで再生回数最大なのは、会社の金で遊んだお勉強したハンコンラジコンの動画(現時点で再生回数8.2万回)。ある時インド人(?)が大挙して押し寄せてきて「くれくれ」コメントが付いたりもした(笑







そして最近になって、隣の部(というか当時の部の後継の部)のクルマ仲間の若者が同じようなことをやろうして俺のブログや動画に流れ着いたそうな(爆





そうかと思えば、同じようなタイミングでこの動画にまたコメントが付いて、なんか教えて欲しいっぽいので、ちょっと色々掘り起こしてみた。





まずは使った材料。






  • ラジコン:タミヤのハイラックスハイリフト(プロポでシフトチェンジできるやつ)

  • プロポ:フタバの4chのヤツATTACK 4YWD(サーボはそのまま利用。プロポ・受信機は使わない。ESCもMFC-02を利用。)

  • マルチファンクションユニットMFC-02

  • ラジコン側のラズパイ:Raspberry Pi Zero Wとユニバーサル基盤

  • ステアリングコントローラー:プレステ3用のUSB接続のヤツ(Logicool Driving Force GT)

  • ハンコン側のラズパイ:Raspberry Pi 2 (別にどれでもいいはず)





うむ、だいぶ忘れてる。そもそもラジコンに載せてたRaspberry Pi Zero Wのログインパスワード忘れてて難儀した。(´・ω・`)





ラジコン側のラズパイを接続する回路(電源&サーボやESCの信号線)





ちょっと回路図どっか行ってしまったけど、ラズパイZero用のユニバーサル基盤で、ラジコンの7.2Vからラズパイ用の5V電源を取り出しつつ(3端子レギュレータの型番忘れた…)、GPIOにラジコンの4ch分のサーボ・ESC信号線と接続するためのコネクタ(3pin×4)を配置。










ラジコン側プログラムのソースを見たところ、使ったGPIOは6, 13, 19, 26番(BCM番号)だったようだ。









ラジコンのバッテリーからの配線取り出しは、何かで見かけた分岐コネクタを利用。コネクタの種類が分からなくて、どこかの電子パーツ屋さんの通販サイトで見た目の近そうなヤツをいくつか買って見つけたんだけど、結局どれだったっけ?これ(EHコネクタ)だったかなあ?





うーん、タイトル通り雑な情報だ…。まあいいや、次。





ラジコン(サーバ)側のプログラム






  • UDPで受信したパラメーターに応じてGPIOにPWM信号を出力する

  • UDPの受信はこちらのページのソースをまねした

  • GPIOのPWM信号出力は、pigpioのgpioServo()を利用

  • アクセルペダルのアナログ値に応じてモーターを回転

  • ステアリングのアナログ値に応じてステアリングのサーボを回転

  • シフトUp/Downのボタンに応じてシフト段を加減算(-1,0,1,2,3)、シフト段に応じた位置にミッション用サーボを回転(ただし-1のときはバックとする。0はニュートラル、だったかな?)

  • マルチファンクションユニットによるライトやウィンカー、ホーンなどのアクションも、それに応じたサーボ信号を疑似的に出力して再現。





<pre class="wp-block-code">// https://qiita.com/tajima_taso/items/fdfed88c1e735ffb41e8

#include <stdio.h> //printf(), fprintf(), perror(), getc()
#include <stdlib.h> //strtod()
#include <sys/socket.h> //socket(), bind(), sendto(), recvfrom()
#include <arpa/inet.h> // struct sockaddr_in, struct sockaddr, inet_ntoa(), inet_aton()
#include <stdlib.h> //atoi(), exit(), EXIT_FAILURE, EXIT_SUCCESS
#include <string.h> //memset(), strcmp()
#include <unistd.h> //close()

#include <time.h> //strftime(), localtime(), time()
#include <ctype.h> //isspace()

#include "udp.h"

#include <pigpio.h>

// サーボのピン番号(BCM番号)
#define PIN_SERVO_1_STEER 6
#define PIN_SERVO_2_ACCEL 13
#define PIN_SERVO_3_LIGHT 19
#define PIN_SERVO_4_SHIFT 26

// http://edu.clipper.co.jp/pg-2-39.html
void trim( char *s ) {
int i, j;

//文字列の最後から空白を読み飛ばして除外する
for( i = strlen(s)-1; i >= 0 && isspace( s[i] ); i-- ) ;
s[i+1] = '\0';
//先頭から空白でない文字まで読み飛ばす
for( i = 0; isspace( s[i] ); i++ ) ;
//前方の空白を詰める
if( i > 0 ) {
j = 0;
while( s[i] ) s[j++] = s[i++];
s[j] = '\0';
}
}

void shift_change(int shift) {
if (shift == 0)
gpioServo(PIN_SERVO_4_SHIFT, 1500 + 400);
else
gpioServo(PIN_SERVO_4_SHIFT, 1500 + 400 - 400*(shift-1));
}

int main(int argc, char* argv[]) {

const char *address = "";
unsigned short port = (unsigned short)atoi(argv[1]);
struct sockaddr servSockAddr, clitSockAddr;
char recvBuffer[MAX_BUFSIZE];

// UDPソケット初期化
int server_sock = get_socket("udp");
sockaddr_init(address, port, &servSockAddr);

if (bind(server_sock, &servSockAddr, sizeof(servSockAddr)) < 0) {
perror("bind() failed.");
exit(EXIT_FAILURE);
}

// pigpio初期化
if (gpioInitialise() < 0) {
printf("\nGPIO cannot initialised\n");
return 1;
}
gpioSetMode(PIN_SERVO_1_STEER, PI_OUTPUT);
gpioSetMode(PIN_SERVO_2_ACCEL, PI_OUTPUT);
gpioSetMode(PIN_SERVO_3_LIGHT, PI_OUTPUT);
gpioSetMode(PIN_SERVO_4_SHIFT, PI_OUTPUT);

gpioServo(PIN_SERVO_1_STEER, 1500);
gpioServo(PIN_SERVO_2_ACCEL, 1500);
gpioServo(PIN_SERVO_3_LIGHT, 1500);
gpioServo(PIN_SERVO_4_SHIFT, 1500 + 400);

// メインループ
int shift = 1; // シフト(1, 2, 3, 0(バック))
int brake = 0; // ブレーキ中=1
int back = 0; // バック中=1
while(1) {
char date[64];
int recvMsgSize = udp_receive(server_sock, recvBuffer, MAX_BUFSIZE, &clitSockAddr);
if (recvMsgSize == MSG_FAILURE) continue;

// バッファの末尾に\0追加
recvBuffer[recvMsgSize] = '\0';
// バッファの前後の空白・改行を除去(trimモドキ)
trim(recvBuffer);

// タイムスタンプを文字列化
// https://www.mm2d.net/main/prog/c/time-01.html
time_t t = time(NULL);
strftime(date, sizeof(date), "%Y/%m/%d %H:%M:%S", localtime(&t));

// デバッグ出力
printf("[%s] <%s> ", date,
inet_ntoa(((struct sockaddr_in *)&clitSockAddr)->sin_addr));

int sendMsgSize = udp_send(server_sock, "OK\n", &clitSockAddr);
if (sendMsgSize == MSG_FAILURE) continue;

// 受け取ったパラメータをパース
char key[MAX_BUFSIZE];
char val[MAX_BUFSIZE];
//parse_param(recvBuffer, key, val);

/*** keyの内容に応じて処理 ***/

// ステアリング
if (strncmp(recvBuffer, "STEERING=", 9) == 0) {
// 浮動小数点(-1.0~+1.0)を読み取る
double value = strtod(&recvBuffer[9], NULL);
printf("STEERING %f\n", value);
gpioServo(PIN_SERVO_1_STEER, 1500 - 400 * value);
}
// アクセル
else if (strncmp(recvBuffer, "ACCEL=", 6) == 0) {
// 浮動小数点(0.0~+1.0)を読み取る
double value = strtod(&recvBuffer[6], NULL);

// 0.1以下はスキップ
if (value < 0.1 && value != 0.0) {
printf("\n");
continue;
}

printf("ACCEL %f\n", value);

// バックの場合
if (shift == 0) {
// 符号を反転
value = -value;

// バックを離した瞬間
if (value == 0.0) back = 0;
// バックの踏み始めは一瞬バックを入れる
else if (back == 0) {
back = 1;
gpioServo(PIN_SERVO_2_ACCEL, 1500 + 100);
gpioSleep(PI_TIME_RELATIVE, 0, 200000);
gpioServo(PIN_SERVO_2_ACCEL, 1500);
gpioSleep(PI_TIME_RELATIVE, 0, 10000);
printf("BACK START!!\n");
}
}

gpioServo(PIN_SERVO_2_ACCEL, 1500 - 400 * value);
}
// ブレーキ
else if (strncmp(recvBuffer, "BRAKE=", 6) == 0) {
// 浮動小数点(0.0~+1.0)を読み取る
double value = strtod(&recvBuffer[6], NULL);

// 0.1以下はスキップ
if (value < 0.1 && value != 0.0) {
printf("\n");
continue;
}

printf("BRAKE %f\n", value);

// ブレーキを離した瞬間
if (value == 0.0) brake = 0;
// ブレーキの踏み始めは一瞬前進を入れる
else if (brake == 0) {
brake = 1;
gpioServo(PIN_SERVO_2_ACCEL, 1500 - 50);
gpioSleep(PI_TIME_RELATIVE, 0, 20000);
gpioServo(PIN_SERVO_2_ACCEL, 1500);
gpioSleep(PI_TIME_RELATIVE, 0, 10000);
printf("BRAKE START!!\n");
}
gpioServo(PIN_SERVO_2_ACCEL, 1500 + 400 * value);
}

// ホーン
else if (strcmp(recvBuffer, "HORN=ON") == 0) {
gpioServo(PIN_SERVO_3_LIGHT, 1500 - 400);
printf("HORN ON!!\n");
}
else if (strcmp(recvBuffer, "HORN=OFF") == 0) {
gpioServo(PIN_SERVO_3_LIGHT, 1500);
printf("HORN OFF!\n");
}
// ハイビーム(バンパー前のフォグ)
else if (strcmp(recvBuffer, "HIGHBEAM=ON") == 0) {
gpioServo(PIN_SERVO_3_LIGHT, 1500 - 300);
printf("HIGHBEAM ON!!\n");
}
else if (strcmp(recvBuffer, "HIGHBEAM=OFF") == 0) {
gpioServo(PIN_SERVO_3_LIGHT, 1500);
printf("HIGHBEAM OFF!\n");
}
// クラッチ

// シフト
else if (strcmp(recvBuffer, "SHIFT=UP") == 0) {
shift++;
if (shift > 3) shift = 3;
shift_change(shift);
printf("SHIFT UP!!i [%d]\n", shift);
}
else if (strcmp(recvBuffer, "SHIFT=DOWN") == 0) {
shift--;
if (shift < 0) shift = 0;
shift_change(shift);
printf("SHIFT DOWN!! [%d]\n", shift);
}
// ウィンカー(R2,L2)
else if (strcmp(recvBuffer, "WINKER=RIGHT") == 0) {
gpioServo(PIN_SERVO_1_STEER, 1500);
gpioServo(PIN_SERVO_3_LIGHT, 1500 + 400);
gpioSleep(PI_TIME_RELATIVE, 0, 100000); // sleep for 0.1 seconds
gpioServo(PIN_SERVO_3_LIGHT, 1500);
gpioSleep(PI_TIME_RELATIVE, 0, 100000); // sleep for 0.1 seconds
gpioServo(PIN_SERVO_1_STEER, 1500 - 120);
printf("WINKER RIGHT\n");
}
else if (strcmp(recvBuffer, "WINKER=LEFT") == 0) {
gpioServo(PIN_SERVO_1_STEER, 1500);
gpioServo(PIN_SERVO_3_LIGHT, 1500 + 400);
gpioSleep(PI_TIME_RELATIVE, 0, 100000); // sleep for 0.1 seconds
gpioServo(PIN_SERVO_3_LIGHT, 1500);
gpioSleep(PI_TIME_RELATIVE, 0, 100000); // sleep for 0.1 seconds
gpioServo(PIN_SERVO_1_STEER, 1500 + 150);
printf("WINKER LEFT\n");
}
else if (strcmp(recvBuffer, "WINKER=OFF") == 0) {
gpioServo(PIN_SERVO_1_STEER, 1500);
printf("WINKER OFF\n");
}

// ライト点灯(□)
else if (strcmp(recvBuffer, "LIGHT=UP") == 0) {
gpioServo(PIN_SERVO_1_STEER, 1500);
gpioServo(PIN_SERVO_3_LIGHT, 1500 + 50 + 400);
gpioSleep(PI_TIME_RELATIVE, 0, 100000); // sleep for 0.1 seconds
gpioServo(PIN_SERVO_3_LIGHT, 1500 + 50);
gpioSleep(PI_TIME_RELATIVE, 0, 100000); // sleep for 0.1 seconds
printf("LIGHT UP!\n");
}
// ハザード(△)
else if (strcmp(recvBuffer, "HAZARD=ON") == 0) {
gpioServo(PIN_SERVO_4_SHIFT, 1500 - 50);
gpioSleep(PI_TIME_RELATIVE, 0, 500000); // sleep for 0.1 seconds
gpioServo(PIN_SERVO_4_SHIFT, 1500 - 50 - 400);
gpioSleep(PI_TIME_RELATIVE, 0, 500000); // sleep for 0.1 seconds
gpioServo(PIN_SERVO_4_SHIFT, 1500 - 50);
gpioSleep(PI_TIME_RELATIVE, 0, 500000); // sleep for 0.1 seconds
// shift_change(shift);
printf("HAZARD ON!\n");
}
// エンジン停止・始動(PSボタン)


// 未対応のパラメータ
else {
printf("not supported. '%s'\n", recvBuffer);
}
}

// 終了処理
gpioTerminate();
return 0;
}

</pre>



ハンコン(クライアント)側のプログラム






  • ステアリングコントローラーからの値の読み取りはこのあたりを参考にした(linux/joystick.hを利用)


  • アクセルペダル、ブレーキペダル、ステアリングなどの操作があったら、そのアナログ値を取得してUDPで送信

  • シフトチェンジボタン、ウィンカー(R2, L2)、ホーン(GTボタン)、ライト点灯(□)、ハイビーム(○)、ハザード(△)、エンジン始動・停止(PSボタン)などのボタン入力があったら、それをUDPで送信

  • UDPの送信はラジコン側と同様のページをマネっこ





<pre class="wp-block-code">// ステアリングコントローラーからの値の読み取りサンプル
// https://wlog.flatlib.jp/item/1682
// https://www.kernel.org/doc/Documentation/input/joystick-api.txt

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/joystick.h>

#include <string.h>
#include <signal.h>
#include <errno.h>

#include "udp.h"

int main(int argc, char* argv[]) {
if (argc != 3) {
fprintf(stderr, "argument count mismatch error.\n");
exit(EXIT_FAILURE);
}

/*** UDP Socketの初期化(ここから) ***/
const char *address = argv[1];
unsigned short port = (unsigned short)atoi(argv[2]);
struct sockaddr servSockAddr, clitSockAddr;
struct sigaction action;

int server_sock = get_socket("udp");
sockaddr_init(address, port, &servSockAddr);

sigaction_init(&action, catchAlarm);
if (sigaction(SIGALRM, &action, NULL) < 0) {
perror("sigaction() failure");
exit(EXIT_FAILURE);
}
/*** UDP Socketの初期化(ここまで) ***/

// ステアリングコントローラーのデバイスファイルを開く
int fd = open("/dev/input/js0", O_RDONLY);
if (fd == -1) {
printf("Can't open /dev/input/js0\n");
exit(0);
}

int flag_hazard = 0; // 1(ON), 0(OFF)
int flag_shift = 0; // 3, 2, 1, 0(N), -1(R)
int flag_winker = 0; // 1(R), 0(OFF), -1(L)
// char flag_light = 0; // 1, 2, 3, 4
int flag_engine = 1; // 1(ON), 0(OFF)
while (1) {
struct js_event event;
char sendBuffer[MAX_BUFSIZE];
char receiveBuffer[MAX_BUFSIZE];

double value = 0.0;

// ステアリングコントローラーから読み取る
if (read(fd, &event, sizeof(event))
< sizeof(event)) {
continue;
}

switch (event.type & 0x7f) {
case JS_EVENT_BUTTON:
printf("BUTTON: number=%d, value=%d ",
event.number, event.value);

// ホーン(GTボタン)
if (event.number == 19) {
if (event.value == 1) {
udp_send(server_sock, "HORN=ON", &servSockAddr);
printf("HORN=ON");
}
else {
udp_send(server_sock, "HORN=OFF", &servSockAddr);
printf("HORN=OFF");
}
}
// ハイビーム(○ボタン)
else if (event.number == 2) {
if (event.value == 1) {
udp_send(server_sock, "HIGHBEAM=ON", &servSockAddr);
printf("HIGHBEAM=ON");
}
else {
udp_send(server_sock, "HIGHBEAM=OFF", &servSockAddr);
printf("HIGHBEAM=OFF");
}
}
// クラッチ
// シフトチェンジ(パドルまたはレバー)
else if ((event.number == 4 || event.number == 12 )
&& event.value == 1) {
udp_send(server_sock, "SHIFT=UP", &servSockAddr);
printf("SHIFT=UP");
}
else if ((event.number == 5 || event.number == 13 )
&& event.value == 1) {
udp_send(server_sock, "SHIFT=DOWN", &servSockAddr);
printf("SHIFT=DOWN");
}
// ウィンカー(R2,L2) ※改善の余地あり
// ウィンカー直後はステアリングをキャンセルしたい…
else if (event.number == 6 && event.value == 1) {
flag_hazard = 0;
udp_send(server_sock, "WINKER=RIGHT", &servSockAddr);
printf("WINKER=RIGHT");
}
else if (event.number == 7 && event.value == 1) {
flag_hazard = 0;
udp_send(server_sock, "WINKER=LEFT", &servSockAddr);
printf("WINKER=LEFT");
}
// ライト点灯(□)
else if (event.number == 1 && event.value == 1) {
udp_send(server_sock, "LIGHT=UP", &servSockAddr);
printf("LIGHT=UP");
}
// ハザード(△)
else if (event.number == 3 && event.value == 1) {
flag_hazard ^= 1;
if (flag_hazard) {
udp_send(server_sock, "HAZARD=ON", &servSockAddr);
printf("HAZARD=ON");
}
else {
udp_send(server_sock, "HAZARD=OFF", &servSockAddr);
printf("HAZARD=OFF");
}
}
// エンジン停止・始動(PSボタン)
else if (event.number == 20 && event.value == 1) {
flag_engine ^= 1;
if (flag_engine) {
udp_send(server_sock, "ENGINE=START", &servSockAddr);
printf("ENGINE=START");
}
else {
udp_send(server_sock, "ENGINE=STOP", &servSockAddr);
printf("ENGINE=STOP");
}
}

printf("\n");
break;

case JS_EVENT_AXIS:
printf("AXIS: number=%d, value=%d ",
event.number, event.value);
// ステアリング
if (event.number == 0) {
value = event.value / 32767.0;
sprintf(sendBuffer, "STEERING=%f", value);
udp_send(server_sock, sendBuffer, &servSockAddr);
printf(sendBuffer);
}
// アクセル(とりあえず前進だけ)
else if (event.number == 1) {
value = (32767.0 - event.value) / (32767*2);
sprintf(sendBuffer, "ACCEL=%f", value);
udp_send(server_sock, sendBuffer, &servSockAddr);
printf(sendBuffer);
}
// ブレーキ
else if (event.number == 2) {
value = (32767.0 - event.value) / (32767*2);
sprintf(sendBuffer, "BRAKE=%f", value);
udp_send(server_sock, sendBuffer, &servSockAddr);
printf(sendBuffer);
}
printf("\n");
break;

default:
printf("OTHER\n");
break;
}
}

// 終了処理
close(fd);
return 0;
}

</pre>



プログラム一式





https://www.tapoblog.0t0.jp/wp-content/uploads/SocketRC_20181031.tar.gz





一応Makefileやreadme.txtも入れてあるので、コンパイルや実行はできると思う。普通の2chラジコンでも、アクセル・ブレーキ・ステアリングは動くと思う。





ダサいプログラムでちょっと恥ずかしいけど、こんな感じで参考になったかなあ?


Posted at 2024/01/02 22:04:12 | コメント(1) | トラックバック(0) | 趣味

プロフィール

「@ぷーおん なんですとー!?Σ(・□・;)全然気付いてなかったですw」
何シテル?   04/23 20:58
カレン(ST206/3S-GE VVT-i)で夫婦でサーキット走行してます. 本家はこちら https://www.tapoblog.0t0.jp/ ...
みんカラ新規会員登録

ユーザー内検索

<< 2024/1 >>

 1 234 56
78910111213
14151617181920
21222324252627
28293031   

リンク・クリップ

簡易型クラッチストッパー いろいろ。 
カテゴリ:その他(カテゴリ未設定)
2024/04/27 13:08:29
内装/クラッチストッパーかさ増し 
カテゴリ:その他(カテゴリ未設定)
2024/04/27 13:06:04
CANバスのデータ割り込みはヤバイ:セキュリティ法規解説 第四報 
カテゴリ:その他(カテゴリ未設定)
2024/01/29 19:52:19

愛車一覧

スバル BRZ 3号機(RAエアコン号) (スバル BRZ)
1号機から2号機へのエンジン載せ換え中の足として購入(嘘 エアコン万歳!
トヨタ カレン たぽカレン2号機 (トヨタ カレン)
1号機復活のための部品取り車として、車検切れ間際のこの車を、知人から格安で購入。 しかし ...
トヨタ カレン たぽカレンVVT-i (トヨタ カレン)
カレンってパーツ少なくて苦労しますなぁ(笑). 3S-FEから3S-GE VVT-i(通 ...
トヨタ スプリンターマリノ トヨタ スプリンターマリノ
親の車を譲り受けたけど,東海豪雨で水没したかわいそうな車.
ヘルプ利用規約サイトマップ
© LY Corporation