Raspberry Pi 3를 사용하여 경제적인 산업용 컨트롤러 구축

DigiKey 북미 편집자 제공

소규모 상점에서 산업용으로 운영하려면 열악한 운영 환경, 높은 I/O 용량, 복잡한 기능 요구 사항을 모두 충족해야 합니다. 이는 바로 프로그래밍 가능 논리 컨트롤러(PLC)의 원래 의도와 일치합니다. PLC의 축소형 버전도 제공되지만, 설계자는 이제 효과적인 산업 모니터링 및 제어를 위한 경제적인 오픈 소스 하드웨어 및 소프트웨어 솔루션 어레이를 선택할 수 있습니다.

그러한 솔루션의 예로는 Raspberry Pi Foundation의초소형 Raspberry Pi 3와 관련 온보드 기판이 있습니다. 이 기사에서는 Raspberry Pi 3의 주요 특성에 대해 설명한 다음 모니터링 및 제어 응용 분야에서 이 솔루션을 사용하는 방법을 알아봅니다.

소규모 상점 산업 제어에 Raspberry Pi를 사용해야 하는 이유

대부분의 소규모 운영에서 Raspberry Pi 3 플랫폼은 탁월한 수행 능력을 갖춘 경제적인 솔루션을 제공합니다. 전용 산업 자동화 작업을 완벽하게 처리할 수 있는 Raspberry Pi 3 보드는 Broadcom ARM® Cortex®-A53 기반 프로세서, 1Gbyte RAM, 디지털 인터페이스, Wi-Fi 및 Bluetooth 연결을 결합합니다. 이 프로세서는 그 자체가 쿼드 코어 ARM Cortex-A53 CPU를 512Kbytes L2 캐시, 3개의 뱅크에 배열된 54개 GPIO와 통합하는 고성능 SoC(시스템온칩) 장치입니다.

개별 GPIO는 펄스 폭 변조기, 클록, 직렬 인터페이스를 비롯하여 최소 2개 최대 6개의 대체 기능을 다양하게 지원합니다. 개발자는 할당되지 않은 GPIO를 인터럽트 라인, 입력 또는 출력으로 사용하여 최대 16mA(GPIO 뱅크당 최대 총 50mA)를 공급할 수 있습니다.

Raspberry Pi 제품군의 다른 구성 제품과 마찬가지로 Raspberry Pi 3는 초보자를 위해 내장형 개발 도구를 간소화하도록 설계되었지만, 더 복잡하고 강력한 처리 요구 사항을 가진 숙련된 개발자의 요구도 충족할 수 있습니다.

시작하려면 기판의 동영상 포트를 디스플레이에 연결하고 USB 포트를 키보드 및 마우스에 연결하면 됩니다. 소프트웨어 설계를 위해 개발자는 기판의 microSD 인터페이스를 통해 메모리 카드에서 로드되는 Raspberry Pi Foundation의 무료 Linux 기반 Raspbian 운영 체제에서 지원하는 기판 에코시스템을 사용하여 구축할 수 있습니다.

산업용 기능 추가

우수한 성능과 손쉬운 개발 외에 Raspberry Pi는 기능을 간편하게 확장할 수 있으므로 산업 자동화 응용 분야의 다양한 요구 사항을 효과적으로 충족합니다. 하드웨어 기능을 추가하려면 HAT(Hardware Attached on Top)라는 온보드 기판을 Raspberry Pi 3 기판에 연결하면 됩니다. 더 복잡한 산업용 시스템과 마찬가지로 HAT는 HAT를 식별하고 필요에 따라 GPIO와 드라이버를 자동으로 구성하는 표준 방식을 제공합니다. 따라서 개발자는 Pimoroni PIM213 Automation HAT(그림 1)를 연결하여 산업용 Raspberry Pi 시스템을 쉽고 빠르게 업그레이드할 수 있습니다.

Pimoroni의 Automation HAT 온보드 기판 이미지

그림 1: 개발자는 Pimoroni Automation HAT와 같은 특수 온보드 기판을 연결하여 산업 자동화를 위해 기본 Raspberry Pi 3 기판을 업그레이드할 수 있습니다. (이미지 출처: Pimoroni)

자동화 시스템의 모니터링과 제어를 위해 특별히 설계된 Pimoroni Automation HAT는 아날로그 및 디지털 입력, 전원 출력, 릴레이 제어를 비롯한 여러 I/O 채널을 결합합니다. 24V 기능과 함께 I/O 채널은 상당한 입력 및 출력 버퍼링을 제공합니다. 예를 들어, 릴레이 출력은 최대 2A를 지원하므로 Crouzet 81 546 001 솔레노이드 밸브와 같은 저전력 24V 부품을 충분히 구동할 수 있습니다.

Automation Hat를 통한 소프트웨어 개발의 경우 Pimoroni는 단 몇 줄의 코드를 통해 HAT의 하드웨어 기능을 사용할 수 있는 연결된 Python 모듈을 제공합니다. Python 프로그램으로 가져올 경우 Pimoroni 모듈은 아날로그 입력, 디지털 출력, 릴레이 출력, LED 조명 제어를 위한 소프트웨어 개체를 생성합니다. 각 개체는 적절한 하위 수준 읽기/쓰기 기능(목록 1)을 포함합니다.

class AnalogInput(object):

type = 'Analog Input'

def __init__(self, channel, max_voltage, led):

self._en_auto_lights = True

self.channel = channel

self.value = 0

self.max_voltage = float(max_voltage)

self.light = SNLight(led)

def auto_light(self, value):

self._en_auto_lights = value

return True

def read(self):

"""Return the read voltage of the analog input"""

return round(self.value * self.max_voltage, 2)

def _update(self):

self.value = ads1015.read(self.channel)

def _auto_lights(self):

if self._en_auto_lights:

adc = self.value

self.light.write(max(0.0,min(1.0,adc)))

목록 1: Pimoroni의 Automation HAT용 Python 모듈은 온보드 아날로그 디지털 컨버터(ADC)에서 읽기와 같은 세부 트랜잭션을 처리하여 개발을 간소화합니다. (이미지 출처: Pimoroni)

각 개체는 해당 채널과 기타 관련 데이터를 식별합니다. 예를 들어, 생성 시 아날로그 입력 개체는 연결된 핀에 대한 최대 전압을 포함합니다(목록 1의 초기 기능 참조). 아날로그 디지털 컨버터(ADC) 전환을 수행하기 위해 ADC 개체는 기본 ADC 모듈(목록 1의 ads1015.read)을 호출합니다. 그러면 ADC 모듈은 ADC를 설정하고 전환을 수행하는 데 필요한 낮은 수준의 I2C 트랜잭션을 수행한 다음 값을 유용한 형태로 반환합니다(목록 2).

class ads1015:

def __init__(self, i2c_bus=None, addr=ADDR):

self._over_voltage = [False] * 4

self.i2c_bus = i2c_bus

if not hasattr(i2c_bus, "write_i2c_block_data") or not hasattr(i2c_bus, "read_i2c_block_data"):

raise TypeError("Object given for i2c_bus must implement write_i2c_block_data and read_i2c_block_data")

self.addr = addr

def read(self, channel=0, programmable_gain=PGA_4_096V, samples_per_second=1600):

# sane defaults

config = 0x0003 | 0x0100

config |= SAMPLES_PER_SECOND_MAP[samples_per_second]

config |= CHANNEL_MAP[channel]

config |= PROGRAMMABLE_GAIN_MAP[programmable_gain]

# set "single shot" mode

config |= 0x8000

# write single conversion flag

self.i2c_bus.write_i2c_block_data(self.addr, REG_CFG, [(config >> 8) & 0xFF, config & 0xFF])

delay = (1.0 / samples_per_second) + 0.0001

time.sleep(delay)

data = self.i2c_bus.read_i2c_block_data(self.addr, REG_CONV)

value = ((data[0] << 4) | (data[1] >> 4))

if value & 0x800:

value -= 1 << 12

value /= 2047.0 # Divide down to percentage of FS

value *= float(programmable_gain)

value /= 3300.0 # Divide by VCC

return value

...

목록 2: ADC 전환을 위해 높은 수준의 함수를 호출하면 읽기 루틴이 호출됩니다. 이 루틴은 I2C 버스 쓰기를 수행하여 전환을 시작하고, 전환이 완료되는 동안 절전 상태를 유지하고, I2C 버스 읽기를 수행하여 결과를 수집합니다. (이미지 출처: Pimoroni)

하지만 개발자의 경우 아날로그 값을 읽으려면 아날로그 개체용으로 지정된 아날로그 입력(.one)에서 높은 수준의 읽기 함수(.read())를 실행하면 됩니다.

value = automationhat.analog.one.read()

라이브러리는 다른 HAT 기능에 대해 이 단순 모델을 지원하므로 릴레이를 켜거나 끄면 간단히 호출됩니다.

automationhat.relay.write(1) # 1 = ON, 0 = OFF

유연한 옵션

Pimoroni Automation HAT는 소규모 산업 자동화 응용 분야에 필요한 기본 IO 기능을 제공하지만, 개발자는 산업 자동화와 같은 특수 응용 분야에 필요한 풍부한 가용 HAT 세트 중에서 선택할 수 있습니다. 예를 들어, Adafruit 3013 RTC HAT는 기판의 표준 기능이 아닌 실시간 클록(RTC) 기능을 제공합니다. Raspberry Pi 설계자는 개발자가 기판을 인터넷에 연결된 상태로 유지하여 표준 NTP(Network Time Protocol)를 통해 클록 시간을 유지할 수 있을 것으로 기대합니다. 따라서 설계 중에 의도적으로나 사고로 인터넷 연결이 끊어질 수 있는 경우 Adafruit RTC HAT와 같은 외부 RTC가 필요합니다.

개발자는 RTC와 같은 기능을 추가할 때 산업 자동화 설계에서 단일 HAT로 기능을 제한할 필요가 없습니다. Raspberry Pi 기판 위에 여러 HAT를 세로로 쌓을 수 있습니다. 대부분의 HAT는 세로로 쌓을 수 있도록 설계되지만 개발자는 조립품 완성을 위해 Adafruit의 2223와 같은 스택 헤더를 추가하거나, HAT가 서로 또는 기본 기판과 접촉하는 것을 방지하기 위해 M2.5 스탠드오프를 추가해야 할 수도 있습니다.

스택 헤더와 스탠드오프를 사용하여 개발자는 Adafruit 2348 모터 HAT와 같은 HAT를 손쉽게 쌓아서 많은 산업 자동화 응용 분야에 필요한 모터 드라이버를 추가할 수 있습니다. 각 2348 모터 HAT는 2개의 스테퍼 모터 또는 4개의 DC 모터를 구동할 수 있습니다. 실제로 개발자는 최대 32개의 온보드 기판을 쌓아서 최대 64개의 스테퍼 모터 또는 128개의 DC 모터를 지원할 수 있습니다(그림 2).

Adafruit의 여러 2348 모터 HAT 이미지

그림 2: 개발자는 여러 Adafruit 2348 모터 HAT를 쌓아서 설계에서 최대 64개의 스테퍼 모터 또는 128개의 DC 모터를 지원할 수 있습니다. (이미지 출처: Adafruit)

Pimoroni Automation HAT와 마찬가지로 몇 가지 간단한 Python 명령을 사용하여 Adafruit 2348 모터 HAT를 프로그래밍할 수 있습니다. Adafruit의 모터 HAT용 샘플 소프트웨어만으로도 Python 스레드 모듈을 사용하여 여러 모터를 병렬로 실행하는 기본 설계 패턴을 확인할 수 있습니다(목록 3).

from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor, Adafruit_StepperMotor

import threading

# create a default object, no changes to I2C address or frequency

mh = Adafruit_MotorHAT()

# create empty threads (these will hold the stepper 1 and 2 threads)

st1 = threading.Thread()

st2 = threading.Thread()

. . .

myStepper1 = mh.getStepper(200, 1) # 200 steps/rev, motor port #1

myStepper2 = mh.getStepper(200, 2) # 200 steps/rev, motor port #1

myStepper1.setSpeed(60) # 30 RPM

myStepper2.setSpeed(60) # 30 RPM

stepstyles = [Adafruit_MotorHAT.SINGLE, Adafruit_MotorHAT.DOUBLE, Adafruit_MotorHAT.INTERLEAVE, Adafruit_MotorHAT.MICROSTEP]

def stepper_worker(stepper, numsteps, direction, style):

#print("Steppin!")

stepper.step(numsteps, direction, style)

#print("Done")

while (True):

if not st1.isAlive():

randomdir = random.randint(0, 1)

if (randomdir == 0):

dir = Adafruit_MotorHAT.FORWARD

else:

dir = Adafruit_MotorHAT.BACKWARD

randomsteps = random.randint(10,50)

st1 = threading.Thread(target=stepper_worker, args=(myStepper1, randomsteps, dir, stepstyles[random.randint(0,3)],))

st1.start()

if not st2.isAlive():

randomdir = random.randint(0, 1)

if (randomdir == 0):

dir = Adafruit_MotorHAT.FORWARD

else:

dir = Adafruit_MotorHAT.BACKWARD

randomsteps = random.randint(10,50)

print("%d steps" % randomsteps)

st2 = threading.Thread(target=stepper_worker, args=(myStepper2, randomsteps, dir, stepstyles[random.randint(0,3)],))

st2.start()

목록 3: Adafruit의 모터 HAT Python 모듈에는 간단한 제어 명령과 Python 스레드 모듈을 사용하여 스테퍼 모터 쌍을 제어하는 과정을 보여주는 이 코드 조각과 같은 샘플 소프트웨어가 포함되어 있습니다. (이미지 출처: Adafruit)

사용 가능한 HAT에 제공되지 않는 기능의 경우 개발자는 HAT 형식으로 기능을 제한할 필요가 없습니다. DFRobot DFR0327 Arduino 실드, Seeed Technology GrovePi+ 시험용 키트 및 MikroElektronika MIKROE-2756 클릭 실드를 사용하여 개발자는 각각 사용 가능한 Arduino 실드, Grove 장치MikroBUS 클릭 기판의 기판 어레이에 액세스할 수 있습니다.

개발자는 이러한 기판을 통해 MikroElektronika MIKROE-988 CAN 클릭 기판을 연결하여 표준 CAN 인터페이스에 대한 지원과 MikroElektronika MIKROE-1296 4mA~20mA 전류 루프 클릭 보드를 통해 4mA~20mA 전류 루프에 대한 지원을 빠르게 추가할 수 있습니다.

소규모 상점 설계 보완

필요한 온보드 기능을 사용하여 Raspberry Pi 기반 설계를 빠르게 구성한 이후에도 적절한 사용자 인터페이스를 빌드하는 데 시간을 허비하는 경우가 있습니다. Raspberry Pi 3을 사용하면 개발자가 설계를 Adafruit의 IO 클라우드 서비스에 연결하여 사용자에게 그래픽 피드백을 제공하고 자동화 프로세스를 제어할 수 있습니다. 개발자는 클라우드 서비스를 이용하여 간단한 데이터 및 프로세스 정보 피드를 생성하고(목록 4) 사용자가 데스크톱, 스마트폰 또는 기타 모바일 장치의 웹 브라우저에서 프로젝트를 모니터링하고 제어할 수 있는 대시보드를 구축할 수 있습니다(그림 3).

# Import library and create instance of REST client.

from Adafruit_IO import Client

aio = Client('YOUR ADAFRUIT IO KEY')

# Send the value 100 to a feed called 'Foo'.

aio.send('Foo', 100)

목록 4: 개발자는 산업 자동화 응용 분야의 데이터를 Adafruit IO 클라우드에 손쉽게 스트리밍하여 표시 및 제어할 수 있습니다. (이미지 출처: Adafruit)

Adafruit의 IO 대시보드 이미지

그림 3: 개발자는 Raspberry Pi 3 기반 산업 자동화 응용 분야의 정보를 표시하고 Adafruit IO 대시보드를 사용하여 제어할 수 있습니다. (이미지 출처: Adafruit)

Raspberry Pi는 간단한 소프트웨어 개발, 다양한 온보드 기판, 우수한 성능을 조합하여 소규모 산업 자동화 응용 분야에 적합한 솔루션을 제공합니다. 하지만 일부 응용 분야에서는 개발자가 Adafruit 3013 RTC HAT와 같은 RTC를 사용하는 구성에서보다 타이밍을 더 세부적으로 제어해야 할 수 있습니다.

3013 RTC HAT는 두 가지 프로그래밍 가능 경보와 방형파 출력 신호를 제공하는 Maxim Integrated DS3231 RTC IC를 기반으로 합니다. 개발자는 경보를 사용하여 지정한 시간(일, 시, 분, 초)에 인터럽트를 생성하거나, 방형파를 사용하여 1Hz 속도로 인터럽트를 생성할 수 있습니다. 1Hz보다 더 빠른 주기적 인터럽트가 필요한 응용 분야의 경우 개발자는 프로세서의 시스템 타이머를 사용하여 맞춤형 소프트웨어 기능을 개발하거나, 인터럽트를 원하는 속도로 생성할 수 있는 맞춤형 하드웨어 카운터를 빌드해야 합니다.

더 빠른 타이밍 분해능이 필요한 응용 분야의 경우 결정적인 응답 대기 시간 요구 사항도 똑같이 중요합니다. 높은 속도에서 표준 Raspbian OS의 응답 대기 시간 변동으로 인해 정확성이 떨어질 수 있습니다. 표준 시스템에서도 밀리초 분해능의 충분히 결정적인 응답을 제공하지만 개발자는 Linux PREEMPT_RT 패치를 사용하여 더 엄격하고 더 결정적인 분해능 요구 사항을 충족해야 할 수 있습니다.

결론

기존 PLC는 소규모 제조, 가공 및 시제품 제작 상점의 소규모 산업 운영 요구 사항과 예산을 일반적으로 충족합니다. 이러한 응용 분야의 경우 Raspberry Pi 3의 기능으로 충분한 적절한 수준의 요구 사항이 제공됩니다.

Raspberry Pi 3와 적절한 온보드 기판을 사용하여 개발자는 광범위한 소규모 상점 운영에 대한 요구 사항을 충족할 수 있는 전용 산업 자동화 시스템을 신속하게 구현할 수 있습니다.

DigiKey logo

면책 조항: 이 웹 사이트에서 여러 작성자 및/또는 포럼 참가자가 명시한 의견, 생각 및 견해는 DigiKey의 의견, 생각 및 견해 또는 DigiKey의 공식 정책과 관련이 없습니다.

게시자 정보

DigiKey 북미 편집자