기본 콘텐츠로 건너뛰기

STM32계열을 Arduino에서 사용하기(OS X 주의)

ESP-8266이나 CC2540/1 계열의 모듈을 사용할 때 독립적으로 사용하여 전력소모 및 복잡도를 낮추는게 좋다고 생각하지만
5v 전압을 사용하거나 좀 더 많은 IO가 필요할 때는 Driver와 MCU사이에서 고민을 하게된다.
Arduino Pro Mini(http://www.aliexpress.com/item/Pro-Mini-Module-Atmega328-5V-16M-For-Arduino-Compatible-With-Nano/2021666535.html) 같은 것도 좋은 선택이겠지만 PWM 드라이버 및 범용 제어 목적으로 만만한 Cortex ARM을 선택.
STM32F103C8T6 개발보드인데 가격이 매우 착하다. 사양도 빵빵함.
http://tw.taobao.com/item/39459211142.htm?fromSite=main&spm=a1z0k.7385961.1997985097.d4918997.dlMnQK&_u=927p8v9r04fd
이렇게 생겼다. 두줄로 되어있어 한꺼번에 두개를 쓰기엔 ESP-01처럼 브레드보드 호환성이 좋지는 않지만 그야 소켓을 만들던 하면 되고 A0~A15까지 16핀으로도 테스트하는데는 아무 문제가 없어서 만족.
역시나 연결은 PL2303으로 하는데 전면의 RX,TX핀만 교차해주고 3.3v나 5v중 필요한 걸 연결하면 된다. GND도 앞뒤로 두개가 있어 편리.
업로드를 위해 BOOT점퍼들을 설정하자.
BOOT0 - LOW
BOOT1 - HIGH
요렇게 놓으면 끝.

타이밍 좋게도 https://github.com/rogerclarkmelbourne/Arduino_STM32 요런게 있어서 Documents/Arduino/hardware 에 다운로드하고 바로 쓸 수 있는데.
OS X용 Arduino는 PL2303의 tty.usbserial 을 인식을 못한다.
실제로 업로드를 하는 serial_upload 툴에서 못씀.

Cannot handle device "/dev/cu.usbserial"이라면서 안되더라.
아무튼 cu를 뒤지면 없는 걸 어떻게 하겠냐.

나만 쓰면 된다는 생각으로 
~/Documents/Arduino/hardware/Arduino_STM32/tools/macosx/serial_upload 를 수정

#!/bin/bash
$(dirname $0)/stm32flash/stm32flash -g 0x8000000 -b 230400 -w "$4" /dev/"$1" 

요렇던 걸. cu/tty 강제 치환하도록 수정.

#!/bin/bash
$(dirname $0)/stm32flash/stm32flash -g 0x8000000 -b 230400 -w "$4" /dev/"${1/cu/tty}" 

잘된다. 잘되야지. 속도를 230400으로 고정한 것은 좋네. 빠른 건 좋은 것.
테스트용으로 간단하게 코드를 작성해본다.

int pin=PA0;
int dir=1;
int dim=0;
void setup() {
  pinMode(pin, OUTPUT);
}

void loop() {
  analogWrite(pin, dim);
  delay(2);
  dim = dim + dir;
  if ((dim>=255) || (dim<=0)) {
    dir=-dir;
  }
}

PWM이 잘 작동하는지 보기 위함인데. 핀 설정이 어떻게 되있나 하고 board.h(~/Documents/Arduino/hardware/Arduino_STM32/STM32F1/variants/generic_stm32f103c/board)를 열어봤더니 enum으로 정의해놓았다.
그 외에 UART, SPI, GPIO, PWM, ADC등 정보도 있으니 꼭 확인해보자.

#define BOARD_NR_USARTS           3
#define BOARD_USART1_TX_PIN       PA9
#define BOARD_USART1_RX_PIN       PA10
#define BOARD_USART2_TX_PIN       PA2
#define BOARD_USART2_RX_PIN       PA3
#define BOARD_USART3_TX_PIN       PB10
#define BOARD_USART3_RX_PIN       PB11

#define BOARD_NR_SPI              2
#define BOARD_SPI1_NSS_PIN        PA4
#define BOARD_SPI1_MOSI_PIN       PA7
#define BOARD_SPI1_MISO_PIN       PA6
#define BOARD_SPI1_SCK_PIN        PA5

#define BOARD_SPI2_NSS_PIN        PB12
#define BOARD_SPI2_MOSI_PIN       PB15
#define BOARD_SPI2_MISO_PIN       PB14
#define BOARD_SPI2_SCK_PIN        PB13

#define BOARD_NR_GPIO_PINS        35
#define BOARD_NR_PWM_PINS         12
#define BOARD_NR_ADC_PINS          9
#define BOARD_NR_USED_PINS         4


#define BOARD_JTMS_SWDIO_PIN      22
#define BOARD_JTCK_SWCLK_PIN      21
#define BOARD_JTDI_PIN            20
#define BOARD_JTDO_PIN            19
#define BOARD_NJTRST_PIN          18

#define BOARD_USB_DISC_DEV        GPIOB
#define BOARD_USB_DISC_BIT        10

// Note this needs to match with the PIN_MAP array in board.cpp
enum {
    PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9, PA10, PA11, PA12, PA13,PA14,PA15,
PB0, PB1, PB2, PB3, PB4, PB5, PB6, PB7, PB8, PB9, PB10, PB11, PB12, PB13,PB14,PB15,
PC13, PC14,PC15
};

테스트를 위해 pwm 제어를 해보자.

int pin=PA0;
int dir=1;
int dim=0;
void setup() {
  pinMode(pin, OUTPUT);
}

void loop() {
  analogWrite(pin, dim);
  delay(2);
  dim = dim + dir;
  if ((dim>=255) || (dim<=0)) {
    dir=-dir;
  }
}

Arduino에서
Tools>Board>STM32 Boards>Generic STM32F103C
Tools>Variant>STM32F103C8 (20k RAM, 64k Flash)
Tools>Upload Method>Serial
Tools>Port>/dev/cu.usb*
로 설정하고 업로드한다.

LED불이 서서히 켜졌다 꺼졌다를 반복하는지 확인하고 PA0대신 다른 핀도 테스트해보자.
BOOT1 점퍼는 업로드할때만 LOW로 열어놓고 그 후엔 다시 HIGH로 닫아놓아야 재시동 후에도 업로드한 프로그램이 실행되니 주의하자.

이 블로그의 인기 게시물

Mac 주의 - 약간 빡치는 git 대소문자 변환 파일명 변환(renaming)하는 법

Mac에서 종종 화나는 일 중 하나가 파일 시스템이 대소문자를 구분하지 않는 점이다.
가령, A.png를 a.png로 바꿔야할 경우 HFS 기준으론 전혀 바뀐 점이 없는 걸로 인식하는데 다소 화가난다.
하지만, 방법이 없는 것은 아닌데

A.png를 임의의 다른 파일로 바꾼다. (ex. A_.png)1에서 바꾼 상태에서 staging 한다. (git add A_.png)1의 파일을 다시 원래 바꾸려고 했던 파일로 바꾼다. (mv A_.png a.png)3을 다시 staging 한다. (git add a.png)commit 한다.https://stackoverflow.com/a/40307511/880991 에서 답변해준 Chris Barr 님에게 감사를.
* 추가

실제로 해보니 git mv --force A.png a.png 가 더 간단하다. 이는 바로 staging 영역에 add까지 해준다.

즐거운 Online Prototyping Tool 들

jsbin, codepen, jsfiddle 이런 것들은 일단 생략. 너무 유명한 것들이라.

https://launchpad.graphql.com - node.js 기반 graphQL 연습장. 이것만으로도 충분히 훌륭한 백엔드
https://codesandbox.io/ npm 사용이 가능한 클라이언트 사이드 연습장. webpackbin이 너무 문제가 많아서 찾아본 것.

https://scrimba.com 이건 codesandbox+ asciinema(https://asciinema.org/) 같은 느낌인데 키 녹화와 음성 녹화 기능이 추가되었다. 다 좋은데 화살표 키로 빨리감기 뒤로감기 기능이 안되고 익스포트(youtube등)으로 지원이 없는게 아쉽다.

이 둘이 만나면? https://codesandbox.io/s/jvlrl98xw3?from-embed
뭐야 이거 무서워 하지마 ㄷㄷ;  graphql+react-native-web(부왘ㅋㅋ)

https://repl.it/languages 전통을 자랑하는 REPL 도구. 지원 언어 종류가 -_-;;;;;

https://tio.run/# repl.it? 장난함? 얘는 지원 언어가 무려 386종류. J랑 아희도 있다.

https://play.golang.org/ 즐거운 go playground. 소스 포멧팅 넘 좋아.

http://decaffeinate-project.org/repl/ 최고의 coffeescript REPL. 원래 용도는 coffee를 ecma6코드로 바꾸는 것이지만...

https://scaphold.io
https://www.graph.cool/ graphql backend service. scaphold.io는 설치도 필요없는 클라우드. graphcool은 호스팅+클라우드 다있음. 둘 다 막상막하. 푸쉬서버도 되고 뭐 미친득.

https://glitch.com/ gomix에서 결국 glitch로 안착.  node.js

https://www.shadertoy.com 잘하고 싶다! 쉐이다! 오디오도 된다!

http:/…

graphql 연습 /w launchpad

https://launchpad.graphql.com/mw9wkzv99
단순 전체쿼리+조건쿼리+추가

http://graphql.org/graphql-js/passing-arguments/
참고. random ID는 crypto 1.0.1 사용
  type Query {
    Members: [member]
    getMember(id: ID!): member
  }
  type member {
    id: ID!
    text: String
  }
  input memberInput {
    text: String
  }
  type Mutation {
    addMember(member: memberInput): member
  } SQL 정의. facebook 쪽은 스트링에 지지는 거 진짜 좋아하네. *.gql 파일이 있다고 하니 이해해주자.
resolver는 var buffer = [];
const resolvers = {
  Query: {
    Members: (root, args, context) => {
      return buffer;
    },
    getMember: (id)=> {
      return buffer.find(o=>o.id)
    }
  },
  Mutation: {
    addMember(_, {member}) {
      const mm = { ...member, id:randomBytes(10).toString('hex') };
      buffer.push(mm);
      return mm;
    }
  }
}; 평범 평범.
https://dev-blog.apollodata.com/tutorial-graphql-subscriptions-server-side-e51c32dc2951 다음으로 pub/sub 연습.
https://launchpad.graphql.com/xvn94n3ql   type Subscription {
    memberAdded: member
  } member가 added되는 순간을 감시. imp…