终结者默默 终结者默默
关注数: 53 粉丝数: 151 发帖数: 1,432 关注贴吧数: 156
PS2手柄遥控Arduino小车 转网友版 电机:有刷直流电机 驱动器:L298n逻辑 控制器:Arduino Mega2560 程序功能实现: - 按下START键,开始前进; - 通过按PS2手柄左边的“上下左右”键实现前进 、后退、左转、右转。 - 按SELECT键停止; #include //for v1.6 /****************************************************************** * set pins connected to PS2 controller: * - 1e column: original * - 2e colmun: Stef? * replace pin numbers by the ones you use ******************************************************************/ //PS2手柄引脚; #define PS2_DAT 13 //14 #define PS2_CMD 11 //15 #define PS2_SEL 10 //16 #define PS2_CLK 12 //17 // 电机控制引脚; #define IN1 4 #define IN2 5 #define IN3 6 #define IN4 7 //PWM控制引脚; int speedPinA = 8; int speedPinB = 9; int speed; /****************************************************************** * select modes of PS2 controller: * - pressures = analog reading of push-butttons * - rumble = motor rumbling * uncomment 1 of the lines for each mode selection ******************************************************************/ #define pressures true //#define pressures false #define rumble true //#define rumble false PS2X ps2x; // create PS2 Controller Class //right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you connect the controller, //or call config_gamepad(pins) again after connecting the controller. int error = 0; byte type = 0; byte vibrate = 0; void setup(){ pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); speed =200; Serial.begin(57600); delay(300) ; //added delay to give wireless ps2 module some time to startup, before configuring it //CHANGES for v1.6 HERE!!! **************PAY ATTENTION************* //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble); if(error == 0){ Serial.print("Found Controller, configured successful "); Serial.print("pressures = "); if (pressures) Serial.println("true "); else Serial.println("false"); Serial.print("rumble = "); if (rumble) Serial.println("true)"); else Serial.println("false"); Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;"); Serial.println("holding L1 or R1 will print out the analog stick values."); Serial.println("Note: Go to http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.billporter.info&urlrefer=23792f83e18c76f0371bffca122c9ba3 for updates and to report bugs."); } else if(error == 1) Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.billporter.info&urlrefer=23792f83e18c76f0371bffca122c9ba3 for troubleshooting tips"); else if(error == 2) Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.billporter.info&urlrefer=23792f83e18c76f0371bffca122c9ba3 for troubleshooting tips"); else if(error == 3) Serial.println("Controller refusing to enter Pressures mode, may not support it. "); // Serial.print(ps2x.Analog(1), HEX); type = ps2x.readType(); switch(type) { case 0: Serial.print("Unknown Controller type found "); break; case 1: Serial.print("DualShock Controller found "); break; case 2: Serial.print("GuitarHero Controller found "); break; case 3: Serial.print("Wireless Sony DualShock Controller found "); break; } } void turnLeft(){ digitalWrite(IN1,HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4,HIGH); } void turnRight(){ digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void forward(){ digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void back(){ digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } void loop(){ /* You must Read Gamepad to get new values and set vibration values ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255) if you don't enable the rumble, use ps2x.read_gamepad(); with no values You should call this at least once a second */ if(error == 1) //skip loop if no controller found return; if(type == 2) {//Guitar Hero Controller return; } else { //DualShock Controller ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed //start 开始运行,电机初PWM为120; if(ps2x.Button(PSB_START)) { Serial.println("Start is being held"); speed = 120; analogWrite(speedPinA, speed); analogWrite(speedPinB, speed); forward(); } // 电机正转; if(ps2x.Button(PSB_PAD_UP)){ Serial.println("Up held this hard: "); speed= 200; analogWrite(speedPinA, speed); analogWrite(speedPinB, speed); forward(); } // 电机反转; if(ps2x.Button(PSB_PAD_DOWN)){ Serial.print("Down held this hard: "); speed= 200; analogWrite(speedPinA, speed); analogWrite(speedPinB, speed); back(); } //左转; if(ps2x.Button(PSB_PAD_LEFT)){ Serial.println("turn left "); analogWrite(speedPinA, speed); analogWrite(speedPinB, 0); turnLeft(); } //右转; if(ps2x.Button(PSB_PAD_RIGHT)){ Serial.println("turn right"); analogWrite(speedPinA, 0); analogWrite(speedPinB, speed); turnRight(); } // Stop if(ps2x.Button(PSB_SELECT)){ Serial.println("stop"); speed = 0; analogWrite(speedPinA,speed); analogWrite(speedPinB,speed); } } } --------------------- 作者:卧龙_ 来源:CSDN 原文:http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fblog.csdn.net%2FDraonly%2Farticle%2Fdetails%2F77319435&urlrefer=ec5ea7da86998f372c8cf7f66d87127c 版权声明:本文为博主原创文章,转载请附上博文链接!
【arduino】DH11学习记录 下载DH11库,写入程序 即可, VCC =+3V Data接数字口11 double Fahrenheit(double celsius) { return 1.8 * celsius + 32; } //摄氏温度度转化为华氏温度 double Kelvin(double celsius) { return celsius + 273.15; } //摄氏温度转化为开氏温度 // 露点(点在此温度时,空气饱和并产生露珠) // 参考: http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwahiduddin.net%2Fcalc%2Fdensity_algorithms.htm&urlrefer=277091fedb64ae81ceaa82eb22f73dd7 double dewPoint(double celsius, double humidity) { double A0= 373.15/(273.15 + celsius); double SUM = -7.90298 * (A0-1); SUM += 5.02808 * log10(A0); SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ; SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ; SUM += log10(1013.246); double VP = pow(10, SUM-3) * humidity; double T = log(VP/0.61078); // temp var return (241.88 * T) / (17.558-T); } // 快速计算露点,速度是5倍dewPoint() // 参考: http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FDew_point&urlrefer=33b29e7526c0c9abe88eac038d0fdbd1 double dewPointFast(double celsius, double humidity) { double a = 17.271; double b = 237.7; double temp = (a * celsius) / (b + celsius) + log(humidity/100); double Td = (b * temp) / (a - temp); return Td; } #include <dht11.h> dht11 DHT11; #define DHT11PIN 11 void setup() { Serial.begin(9600); Serial.println("DHT11 TEST PROGRAM "); Serial.print("LIBRARY VERSION: "); Serial.println(DHT11LIB_VERSION); Serial.println(); } void loop() { Serial.println("\n"); int chk = DHT11.read(DHT11PIN); Serial.print("Read sensor: "); switch (chk) { case DHTLIB_OK: Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: Serial.println("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: Serial.println("Time out error"); break; default: Serial.println("Unknown error"); break; } Serial.print("Humidity (%): "); Serial.println((float)DHT11.humidity, 2); Serial.print("Temperature (oC): "); Serial.println((float)DHT11.temperature, 2); Serial.print("Temperature (oF): "); Serial.println(Fahrenheit(DHT11.temperature), 2); Serial.print("Temperature (K): "); Serial.println(Kelvin(DHT11.temperature), 2); Serial.print("Dew Point (oC): "); Serial.println(dewPoint(DHT11.temperature, DHT11.humidity)); Serial.print("Dew PointFast (oC): "); Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity)); delay(2000); }
翻土墙·看特供 int modbus_read_holding_registers(unsigned char slave_id, unsigned char start_address, unsigned int num_registers, unsigned short * modbus_registers){ unsigned char transmit[255]; //check return values unsigned char *retValue; int i; retValue = transmit; transmit[0] = slave_id;// printf("slave_id: %c", transmit[0]); transmit[1] = MB_READ_HOLDING_REGISTERS; transmit[2] = start_address >> 8; transmit[3] = start_address & 0xFF; transmit[4] = num_registers >> 8; transmit[5] = num_registers & 0xFF; short crc = CRC16(transmit, 6); transmit[6] = crc; transmit[7] = crc >> 8; for (i=0; i<8; i++) { printf("return value [%d] = %x\n", i, *(retValue+i)); } if (write(fd, transmit, 8) == -1) { perror("Unable to write to serial device"); mb_datagram_status = MB_ERROR; return -1; } mb_waiting_for_reply = 1; struct timespec time; clock_gettime(CLOCK_REALTIME, &time); time.tv_sec += 1; /* Time out here if no bytes have been received within the time out period */ if (pthread_cond_timedwait(&datagram_start_receiving, &waiting_for_reply, &time) == ETIMEDOUT) { mb_datagram_status = MB_TIMEOUT; timeout_error_count++; return -1; } printf("after pthread_cond_timedwait()\n"); pthread_cond_wait(&datagram_finished_receiving, &waiting_for_reply); mb_waiting_for_reply = 0; if (mb_datagram_status == MB_OK) { unsigned char byte_count = modbus_read_num_bytes(datagram); mb_datagram_status = MB_OK; unsigned char * datagram_data = datagram + 3; int i; for(i = 0; i < byte_count / 2; i++) { modbus_registers[i] = datagram_data[i * 2] << 8 | datagram_data[i * 2 + 1]; } return byte_count / 2; } else { return mb_datagram_status; } }
1 下一页