diff --git a/rkanoid/src/main.rs b/rkanoid/src/main.rs
index badebf3c166a72f063517b87d0679827d88d4366..7699253d5ea95a6eace96a17de8aafa20a2eae74 100644
--- a/rkanoid/src/main.rs
+++ b/rkanoid/src/main.rs
@@ -162,6 +162,62 @@ enum GameResult {
     LevelFinish(u32),
 }
 
+struct Input {
+    buttons: Buttons,
+    accelerometer: BHI160<Accelerometer>,
+    accel_data_x: f32,
+}
+
+impl Input {
+    pub fn update(&mut self) {
+        self.buttons = Buttons::read();
+        for data in &self.accelerometer.read() {
+            self.accel_data_x = data.x;
+        }
+    }
+
+    pub fn left_bottom(&self) -> bool {
+        self.buttons.left_bottom()
+        || self.accel_is_left()
+    }
+
+    pub fn right_bottom(&self) -> bool {
+        self.buttons.right_bottom()
+        || self.accel_is_right()
+    }
+
+    pub fn left_top(&self) -> bool {
+        self.buttons.left_top()
+    }
+
+    pub fn right_top(&self) -> bool {
+        self.buttons.right_top()
+    }
+
+    pub fn reset(&self) -> bool {
+        self.buttons.reset()
+    }
+
+    pub fn new() -> Self {
+        Input {
+            buttons: Buttons::read(),
+            accelerometer: BHI160::<Accelerometer>::start(),
+            accel_data_x: Default::default(),
+        }
+    }
+
+    fn accel_is_right(&self) -> bool {
+        // technically, true if < 0.0
+        // false if >= 0.0
+        // but need static middle space
+        self.accel_data_x > 0.1
+    }
+
+    fn accel_is_left(&self) -> bool {
+        self.accel_data_x < -0.1
+    }
+}
+
 fn game(level: u16, mut score: u32) -> GameResult {
     let start_time = Seconds::time();
     let display = Display::open();
@@ -172,8 +228,9 @@ fn game(level: u16, mut score: u32) -> GameResult {
     let mut ball_y = Display::H - PADDLE_HEIGHT - BALL_RADIUS;
     let mut ball_direction = Direction::UR;
     let mut blocks = Blocks::generate((0x3F + 0x10 * level).min(0xff) as u8);
+    let mut input = Input::new();
     for tick in 0.. {
-        let input = Buttons::read();
+        input.update();
         let old_paddle = paddle;
         if input.left_bottom() {
             paddle -= PADDLE_SPEED;
@@ -244,7 +301,7 @@ fn game(level: u16, mut score: u32) -> GameResult {
         if check_finish && blocks.is_finished() {
             return GameResult::LevelFinish(score + 100);
         }
-        
+
         display.clear(Color::black());
         // Paddle
         display.rect(
@@ -338,7 +395,7 @@ fn level_finish(level: u16, score: u32) -> bool {
 main!(main);
 fn main() {
     title_screen();
-    
+
     let mut quit = false;
     let mut level = 0;
     let mut score = 0;