toio를 사용한 디지털 초로 Q

매트를 사용하지 않는 초로 Q



Hiroshi Takagi라고 합니다. 평소에는 임베디드 엔지니어를 하고 있습니다.

이번에는 toio의 새로운 업데이트 기능을 사용하여 초로 Q를 만들어 보았습니다.

toio라고 하면 절대 위치 센서입니다만, 이번은 그것을 사용하지 않고 만듭니다.

그렇게 함으로써 전용 매트를 사용하지 않아도 어떤 곳에서도 놀 수 있습니다. 이런 느낌.

디지털 초로 Q #toio 피 c. 라고 r. 코 m / KxHML1 c2 — Hiroshi Takagi (@TkgHrsh) 10월 14, 2020


먼저 모터의 회전 속도를 얻습니다.



조속하지만 갑니다.



시작하려면 모터의 속도 정보 획득 을 사용하여 회전 속도를 얻습니다.



손으로 타이어를 움직일 때의 속도값을 취할 수 있으므로 이 값을 축적하여 쵸로 Q가 움직이는 길이를 결정합니다.



이것은 디폴트 무효이므로, 사용하려면 사전에 이하의 설정으로 유효하게 할 필요가 있으므로 주의입니다. 모터의 속도 정보 획득 설정



움직임은 가속도 지정 모터 제어를 사용



쵸로 Q의 움직임은, 붐으로 나아가 휴는 멈추는 느낌이었으므로,

이런 식으로 시작 속도와 정지 시작 타이밍을 당긴 거리에서 조정합니다.





가속도 컨트롤은 큐브에 맡기고 가속도 지정 모터 제어을 사용했습니다.



구현해보기



이번에 toiojs를 사용했지만 라이브러리가 아직 새로운 기능을 지원하지 않았기 때문에 직접 수정했습니다.

이쪽은 본가의 수정에 기대해, 어플리케이션측의 실장만 기재합니다. (구현이 복잡하고 고마워요)



const { NearestScanner } = require('@toio/scanner')

async function main() {
  // start a scanner to find nearest cube
  const cube = await new NearestScanner().start()
  // connect to the cube
  await cube.connect()

  let sumLeft = 0
  let sumRight = 0
  let moveState = 0
  let moveDelayTimer

  cube.on('motor:speed-feedback', (data) => {
    console.log(data)
    if (data.left === 0 && data.right === 0) {
      if (moveState === 0) {
        if (sumLeft + sumRight > 20) {
          moveState = 1
          moveDelayTimer = setTimeout(()=> {
            const power = (sumLeft + sumRight) / 20
            const curve = (sumRight - sumLeft) / 2
            moveState = 2
            console.log('move', power, curve)
            cube.playPresetSound(1)
            cube.turnOnLight({durationMs: 2550, red: 255, blue: 0, green: 0}, 1)
            cube.moveWithAcc(-power, curve, 0, 0)
            setTimeout(() => {
              console.log('stopping')
              cube.moveWithAcc(0, 0, 20, 0)
            }, power * 10)
          }, 500)
        }
      }else if(moveState === 2){
        cube.turnOffLight()
        cube.playPresetSound(2)
        console.log('stopped')
        moveState = 0
        sumLeft = 0
        sumRight = 0
      }
    }else{
      if(moveState === 0){
        sumLeft += data.left
        sumRight += data.right
      }else if (moveState === 1){
        moveState = 0
        clearTimeout(moveDelayTimer)
      }
    }
  })

  cube.setMotorFeedbackEnable(1).then((result) => {
    console.log(result)
  })
}

main()



포인트는 간단한 상태 섬유를 만들고 있습니다.





타이어를 당기고 있는 동안에는 점점 값을 축적해 갑니다.



타이어 움직임이 멈추면 조금 기다립니다.



이것은 초로 Q는

"끌어서 → 들어 올려 이동하고 → 다시 당겨"

라는 순서로 움직이기 때문에 일시적으로 타이어가 멈출 때를 케어하고 있습니다.



주행 후 일정 시간 후에 가속도로 정지 명령을 발행하고 타이어가 멈추면 처음으로 돌아갑니다.





조금 달리기 시작했지만 이번에는 쵸로 Q의 소개였습니다.

디지털 초로 Q 밖에 할 수 없는 것은, 모터 좌우의 회전수를 따로따로 취득할 수 있으므로,

이런 식으로 커브하여 달릴 수 있습니다.



<script async=""src="https://platform.twitter.com/widgets.js"/>

그 밖에도 디지털이 된 것으로 여러가지 확장할 수 있다고 생각하기 때문에, 만약 뭔가 아이디어 있으면 가르쳐 주세요.



그럼 다시!


좋은 웹페이지 즐겨찾기