.. note:: Hello, welcome to the SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community on Facebook! Dive deeper into Raspberry Pi, Arduino, and ESP32 with fellow enthusiasts. **Why Join?** - **Expert Support**: Solve post-sale issues and technical challenges with help from our community and team. - **Learn & Share**: Exchange tips and tutorials to enhance your skills. - **Exclusive Previews**: Get early access to new product announcements and sneak peeks. - **Special Discounts**: Enjoy exclusive discounts on our newest products. - **Festive Promotions and Giveaways**: Take part in giveaways and holiday promotions. 👉 Ready to explore and create with us? Click [|link_sf_facebook|] and join today! .. _py_keyboard_control: 3. Keyboard Control ================================ In this project, we will learn how to use the keyboard to remotely control the PiCar-X. You can control the PiCar-X to move forward, backward, left, and right. **Run the Code** .. raw:: html .. code-block:: cd ~/picar-x/example sudo python3 3.keyboard_control.py Press keys on keyboard to control PiCar-X! * w: Forward * a: Turn left * s: Backward * d: Turn right * i: Head up * k: Head down * j: Turn head left * l: Turn head right * ctrl + c: Press twice to exit the program **Code** .. code-block:: python from picarx import Picarx from time import sleep import readchar manual = ''' Press keys on keyboard to control PiCar-X! w: Forward a: Turn left s: Backward d: Turn right i: Head up k: Head down j: Turn head left l: Turn head right ctrl+c: Quit ''' def show_info(): print("\033[H\033[J",end='') # clear terminal windows print(manual) if __name__ == "__main__": try: pan_angle = 0 tilt_angle = 0 px = Picarx() show_info() while True: key = readchar.readkey() key = key.lower() if key in('wsadikjl'): if 'w' == key: px.set_dir_servo_angle(0) px.forward(80) elif 's' == key: px.set_dir_servo_angle(0) px.backward(80) elif 'a' == key: px.set_dir_servo_angle(-35) px.forward(80) elif 'd' == key: px.set_dir_servo_angle(35) px.forward(80) elif 'i' == key: tilt_angle+=5 if tilt_angle>35: tilt_angle=35 elif 'k' == key: tilt_angle-=5 if tilt_angle<-35: tilt_angle=-35 elif 'l' == key: pan_angle+=5 if pan_angle>35: pan_angle=35 elif 'j' == key: pan_angle-=5 if pan_angle<-35: pan_angle=-35 px.set_cam_tilt_angle(tilt_angle) px.set_cam_pan_angle(pan_angle) show_info() sleep(0.5) px.forward(0) elif key == readchar.key.CTRL_C: print("\n Quit") break finally: px.set_cam_tilt_angle(0) px.set_cam_pan_angle(0) px.set_dir_servo_angle(0) px.stop() sleep(.2) **How it works?** PiCar-X should take appropriate action based on the keyboard characters read. The ``lower()`` function converts upper case characters into lower case characters, so that the letter remains valid regardless of case. .. code-block:: python while True: key = readchar.readkey() key = key.lower() if key in('wsadikjl'): if 'w' == key: pass elif 's' == key: pass elif 'a' == key: pass elif 'd' == key: pass elif 'i' == key: pass elif 'k' == key: pass elif 'l' == key: pass elif 'j' == key: pass elif key == readchar.key.CTRL_C: print("\n Quit") break