치즈 파이 + 골랑 + 골보로 만든 홈 텃밭 수호 카메라

17008 단어 RaspberryPiGoGobot

최근에 나는 베란다에 화분을 설치하여 채소를 재배했다.
매일 자라는 채소를 보며 즐거워하다.가능하다면 언제 어디서나 널 지켜주고 싶어.
그래서 나는 가정 채소밭 수호 카메라를 만들기로 했다.
참고로 사진은 시금치입니다.☺

프로비저닝

  • 하드웨어
  • Raspberry Pi Zero
  • Raspberry Pi용 카메라 모듈
  • SG90 서보 2축 카메라 장착
  • 소프트웨어
  • golang
  • gobot
  • Golang으로 전자 작업을 할 수 있습니까?그래서 조사해 보니 아주 좋은 프레임워크gobot가 있어서 이걸 사용하기로 했어요.

    최종 품목(중간)



    ↑ 같은 인터넷에 치즈파이와 카메라를 설치해 작물을 지킬 계획이다.
    실제로 운용을 시작할 때는 방우 대책이 필요하다.
    베란다는 어떻게 켜요?문제가 이렇게 해결되었다.

    좋은 케이블을 창문에 끼우고 창틀을 넘어 전원을 베란다로 가져가는 아이디어 상품이다.
    안타깝게도 지금은 만들지 않은 것 같아서 아마존에서 중고품을 샀어요.

    Gobot


    인터넷에 가정채소밭 상황을 올려 실시간으로 보게 하려고 했는데 정성스럽게 만들어서 완제품을 보여줄 수도 없고...
    그래서 이번에는 제작에 사용된 gobot 프레임워크에 대해 설명한다.
    이 글을 쓸 때 gobot의 최신 버전은 1.7.1이다.
    이전 글의 예시 코드는 항상 현재 버전과 호환되지 않습니다.

    Gobot이란 무엇입니까?


    말 그대로 Go 언어로 개발할 수 있는 전자 작업과 IoT를 개발하는 프레임워크다.
    https://gobot.io/
    gobot의 장점 중 하나는 다양한 플랫폼을 지원한다는 것이다.
    라즈파, 아르두노는 당연히 시계 페블과 무인기를 포함한 32개의 플랫폼을 지원한다.
    또한 LED, 서보 등 다양한 부품을 조작할 수 있는 드라이브가 준비되어 있어 API를 통해 간단하게 조작할 수 있다.
    다음은 간단한 예시 코드를 소개한다.

    표시등 깜박임 예제 코드


    우선, Hello World로서 LED를 반짝이게 해 보세요.
    package main
    
    import (
      "time"
    
      "gobot.io/x/gobot"
      "gobot.io/x/gobot/drivers/gpio"
      "gobot.io/x/gobot/platforms/raspi"
    )
    
    func main() {
      raspiAdaptor := raspi.NewAdaptor()
      led := gpio.NewLedDriver(raspiAdaptor, "12")
    
      work := func() {
        gobot.Every(1*time.Second, func() {
          led.Toggle()
        })
      }
    
      robot := gobot.NewRobot("bot",
        []gobot.Connection{raspiAdaptor},
        []gobot.Device{led},
        work,
      )
    
      robot.Start()
    }
    
    나는 네가 그것이 상당히 간단하게 썼다는 것을 알게 될 것이라고 생각한다.
    이번에는 라즈파로 움직였는데, ↓의 부분을 다른 Adaptor로 바꾸면 다른 플랫폼에 대응할 수 있다.
    raspiAdaptor := raspi.NewAdaptor()
    led := gpio.NewLedDriver(raspiAdaptor, "12")
    
    아주 편리해요!
    또한 12 는 바늘 번호의 지정이다.사용하는 바늘 번호로 적당히 고쳐야 한다.
    GPIO 번호가 아닙니다.
    표시등 명령을 설명하는 부분은 work 함수입니다.
    예는 매초에 표시등을 켜거나 끄는 것이다.

    이동 서보 모터의 샘플 코드


    이어서 서보 모터를 가동해 보았다.
    사용된 서보 모터는 SG90입니다.
    package main
    
    import (
      "fmt"
      "time"
    
      "gobot.io/x/gobot"
      "gobot.io/x/gobot/drivers/gpio"
      "gobot.io/x/gobot/platforms/raspi"
    )
    
    func main() {
      adaptor := raspi.NewAdaptor()
      servo := gpio.NewServoDriver(adaptor, "16")
    
      offset := 13
    
      work := func() {
        servo.Move(uint8(27))
    
        gobot.Every(1*time.Second, func() {
          i := gobot.Rand(28)
          fmt.Println("Turning", i + offset)
          servo.Move(uint8(i + offset))
        })
      }
    
      robot := gobot.NewRobot("servoBot",
        []gobot.Connection{adaptor},
        []gobot.Device{servo},
        work,
      )
    
      robot.Start()
    }
    
    초마다 무작위 걸음걸이로 움직인다.
    이렇게 이동 서보도 간단한 코드로 실현할 수 있다.
    애초에 잘못된 것servo.Move이 지정된 각도가 아닌 것 같습니다.
    SG90의 경우 13〜41 사이의 단계에서 13 0도 위치, 41 180도 위치로 작업합니다.
    다른 서보는 또 다른 보진 범위일 수 있다.
    이 부근은 문서에서 규격을 확인하지 못했기 때문에 더듬은 상태에서 자신이 없어서... 미안합니다.

    [주의] 고무줄로 서보 이동 시


    서보 뿐만 아니라 고무 파이에 PWM을 사용할 때 gobot 이외에 설치해야 할 소프트웨어가 있다.
    pi-blaster는 라즈파에서 PWM을 지원하는 소프트웨어입니다.
    https://github.com/sarfata/pi-blaster How to install의 절차에 따라 설치한 후 sudo ./pi-blaster 에서 시작합니다.
    이 기초 위에서 예시 프로그램을 실행하지 않으면 실행할 수 없습니다.
    또한 샘플 프로그램을 멈추고 다시 실행할 때 pi-blaster도kill을 다시 시작해야 합니다.
    나는 이것이 어떤 방법으로 회피할 수 있다고 생각하지만, 아직 해결되지 않았다.

    웹 API 예제 코드


    마지막으로 웹 API를 시도합니다.
    gobot은 웹 서버의 기능을 겸비하여 웹 API화를 쉽게 실현할 수 있다.
    따라서 브라우저 등에서 서보 등을 이동하는 명령을 간단하게 수행할 수 있다.
    package main
    
    import (
      "fmt"
    
      "gobot.io/x/gobot"
      "gobot.io/x/gobot/api"
      "gobot.io/x/gobot/drivers/gpio"
      "gobot.io/x/gobot/platforms/raspi"
    )
    
    func main() {
      gbot := gobot.NewMaster()
    
      adaptor := raspi.NewAdaptor()
      x_servo := gpio.NewServoDriver(adaptor, "16")
      y_servo := gpio.NewServoDriver(adaptor, "18")
    
      offset := 13
      x_i := 14 // center
      y_i := 14 // center
    
      work := func() {
        fmt.Println("Turning x", x_i)
        fmt.Println("Turning y", y_i)
        x_servo.Move(uint8(x_i + offset))
        y_servo.Move(uint8(y_i + offset))
      }
    
      robot := gobot.NewRobot("servoBot",
        []gobot.Connection{adaptor},
        []gobot.Device{x_servo, y_servo},
        work,
      )
    
      // Starts the API server on default port 3000
      api.NewAPI(gbot).Start()
    
      servo_endpoint := gbot.AddRobot(robot)
    
      // Accessible via http://localhost:3000/robots/servoBot/commands/move_servo
      servo_endpoint.AddCommand("move_servo", func(params map[string]interface{}) interface{} {
        req_param := fmt.Sprintf("Params: %+v\n", params)
    
        x_i = int(params["x_num"].(float64))
        y_i = int(params["y_num"].(float64))
    
        robot.Start()
        return req_param
      })
    
      gbot.Start()
    }
    
    이것은 지정된 값의 스텝으로 2개의 서보 모터를 이동하는 프로그램입니다.
    예를 들어,curl에서 다음과 같이 요청합니다.
    컨텐츠 유형은 application/json 이어야 합니다.json이 아니라면params 매개 변수는 값이 없습니다.
    curl -v -H 'Content-Type:application/json' 'http://<ラスパイのIP>:3000/api/robots/servoBot/commands/move_servo' --data '{"x_num":0,"y_num":5}'
    

    【주의】 gobot의 API 클라이언트를 사용할 때


    gobot은 다음 브라우저에서 사용할 수 있는 API 클라이언트를 포함하여 브라우저에서 접근할 수 있습니다http://<ラスパイのIP>:3000/.

    이 API 클라이언트는 주의해야 합니다.
    양식을 입력한 keyvalue 에서 지정한 값은 Content-Type: application/x-www-form-urlencoded 로 간주되며, AddCommand에서 지정한 함수의 params 매개 변수에는 값이 없습니다.
    따라서 어떤 값을 전달하여 동작을 하는 단점이면curl 등에서 내용 형식을 지정하여 요청해야 합니다.

    끝내다


    죄송하지만 아주 적은 샘플만 제공할 수 있지만 간단하지만 기능이 높은 프레임워크를 전달할 수 있다면 기쁩니다.
    다양한 플랫폼에 대응하기 때문에 golang은 다양한 매력을 가지고 놀 수 있다.
    나는 먼저 가정 채소밭 수호 카메라를 완성하고 싶다!

    좋은 웹페이지 즐겨찾기