Носок киборг ваш тренер и друг



    Человеку нужно двигаться, а работая, я постоянно или сижу, или лежу. Поэтому бывает я поднимаю ноги, но тут есть проблема. Я считаю сколько раз поднял ноги, а когда я считаю, то я не могу разговаривать или смотреть внимательно кино. Ситуация стала критичной, когда я решил досмотреть последнии серии Наруто. Поэтому я создал его!



    Что нам надо?


    • Носок
    • Провода
    • Ардуина
    • MPU-6050 (GY-521) — самый дешевый и бесполезный гироскоп+акселерометр $1.80, но на носке работает на 5
    • Ноутбук с программой на Go


    Первым делом надо соединить MPU-6050 c ардуино по I2C, и потом загрузить скетч с Arduino Playground для MPU-6050.

    // MPU-6050 Short Example Sketch
    // By Arduino User JohnChi
    // August 17, 2014
    // Public Domain
    #include<Wire.h>
    const int MPU=0x68;  // I2C address of the MPU-6050
    int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
    void setup(){
      Wire.begin();
      Wire.beginTransmission(MPU);
      Wire.write(0x6B);  // PWR_MGMT_1 register
      Wire.write(0);     // set to zero (wakes up the MPU-6050)
      Wire.endTransmission(true);
      Serial.begin(57600);
    }
    void loop(){
      Wire.beginTransmission(MPU);
      Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
      Wire.endTransmission(false);
      Wire.requestFrom(MPU,14,true);  // request a total of 14 registers
      AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
      AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
      AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
      Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
      GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
      GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
      GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
      Serial.print("AcX = "); Serial.print(AcX);
      Serial.print(" | AcY = "); Serial.print(AcY);
      Serial.print(" | AcZ = "); Serial.print(AcZ);
      Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);  //equation for temperature in degrees C from datasheet
      Serial.print(" | GyX = "); Serial.print(GyX);
      Serial.print(" | GyY = "); Serial.print(GyY);
      Serial.print(" | GyZ = "); Serial.println(GyZ);
      delay(333);
    }
    


    У меня ардуина при подключении отображается как /dev/ttyUSB0, на винде это будет COM c каким-то числом.

    Вот моя программа на Go. Для проигрывания звуков я вызываю программу play, которой у вас может не быть, но тогда и звуков не будет. Ёё можно заменить на другую доступную вам программу.

    package main
    
    import (
    	"fmt"
    	"math"
    	"os/exec"
    	"strings"
    
    	"github.com/CossackPyra/pyraconv"
    	"github.com/tarm/serial"
    )
    
    var (
    	inited     bool = false
    	startAngle float64
    	state      int = 0
    	counter        = 0
    )
    
    func main() {
    
    	c := &serial.Config{Name: "/dev/ttyUSB0", Baud: 57600}
    	s, err := serial.OpenPort(c)
    	panicer(err)
    
    	var b1 []byte
    
    	buf := make([]byte, 128)
    	for {
    		n, err := s.Read(buf)
    		panicer(err)
    		// fmt.Println(n)
    		// fmt.Print(string(buf[:n]))
    		len1 := len(b1)
    		b1 = append(b1, buf[:n]...)
    		pos1 := -1
    		for i1, by1 := range buf[:n] {
    			if by1 == 10 {
    				pos1 = i1
    				break
    			}
    		}
    		if pos1 != -1 {
    			b2 := b1[:len1+pos1]
    			b1 = b1[len1+pos1+1:]
    			s1 := string(b2)
    			// fmt.Println(ss1)
    			ss1 := strings.Split(s1, " | ")
    			if len(ss1) < 7 {
    				continue
    			}
    			m1 := make(map[string]string)
    			for _, s2 := range ss1 {
    				ss2 := strings.Split(s2, " = ")
    				if len(ss2) < 2 {
    					continue
    				}
    				m1[ss2[0]] = ss2[1]
    			}
    			if len(m1) < 7 {
    				continue
    			}
    			m2 := make(map[string]int)
    			for k1, v1 := range m1 {
    				m2[k1] = int(pyraconv.ToInt64(v1))
    			}
    			processMap(m2)
    		}
    	}
    
    }
    
    func processMap(m1 map[string]int) {
    	angle := math.Atan2(float64(m1["AcX"]), float64(m1["AcY"])) / math.Pi * 180.0
    	delta := angle - startAngle
    	if delta > 180.0 {
    		delta -= 360.0
    	}
    	if delta < -180.0 {
    		delta += 360.0
    	}
    	// fmt.Printf("%f %f %d %d %d %d %d %d\n", angle, delta, m1["AcX"], m1["AcY"], m1["AcZ"], m1["GyX"], m1["GyY"], m1["GyZ"])
    	if !inited {
    		inited = true
    		startAngle = angle
    		state = 0
    		return
    	}
    
    	if state == 0 {
    		if delta > 60.0 {
    			state = 1
    			up()
    		}
    		if delta < -60.0 {
    			state = -1
    			up()
    		}
    	}
    	if state == 1 {
    		if delta < 30.0 {
    			state = 0
    			down()
    		}
    	}
    	if state == -1 {
    		if delta > -30.0 {
    			state = 0
    			down()
    		}
    	}
    }
    
    func up() {
    	fmt.Println("UP")
    }
    
    func down() {
    	counter++
    	fmt.Println("DOWN ", counter)
    	if counter%100 == 0 {
    		exec.Command("play", "~/my/applications/platformerFX/OGG/speedup.ogg").Output()
    	} else if counter%50 == 0 {
    		exec.Command("play", "~/my/applications/platformerFX/OGG/checkpoint.ogg").Output()
    	} else if counter%20 == 0 {
    		exec.Command("play", "~/my/applications/platformerFX/OGG/collect1_score1.ogg").Output()
    	} else {
    		exec.Command("play", "~/my/applications/platformerFX/OGG/button1.ogg").Output()
    	}
    }
    
    func panicer(err error) {
    	if err != nil {
    		panic(err)
    	}
    }
    

    Разработкой я очень доволен. Сделать это все можно достаточно быстро, а так как код у вас есть, то еще быстрей!

    Будьте здоровы, занимайтесь спортом.
    Поделиться публикацией
    Похожие публикации
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 5
      0
      Беспонтово, 21 век на дворе, а тут провода… Надо wifi или блюпуп…
        +2
        Да это же единственный в мире экспериментальный образец, сделайте скидку.

        А если по теме — гениальное устройство. Можно запилить в виде носков и браслетиков, и прям хоть патентуй и продавай, для сидячей работы самое оно.
        0
        Странное изобретение. А зачем ноги поднимать?
          0
          Мальчик-с-пальчик сел на диванчик,
          Ножку поднял — в лог записал.
          +4
          С таким изобретением нужно сразу на Кикстартер.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое