0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pi picoでmicropython その40

Last updated at Posted at 2023-04-08

概要

picoでmicropythonやってみた。
練習問題やってみた。

練習問題

俺言語インタープリタを拡張し、AMラジオを鳴らせ。

方針

?='abc'で、右項に'が来れば、ドレミを発振させる。
PWMを600kHzで使う。
GP17ピンに、銅線を繋ぐ。(アンテナ)
ラジオは、600kHzに、同調させる。

ドレミのソースコード

10 ?='chhhgececcaceeeehegaq'
20 ?='aceehjhghgeeceeelhljq'
30 #=10

サンプルコード

import random
import time
import sys
import utime
from machine import Pin, PWM
Ram = []
Lbf = 237
Bnd = 234
PC = 235
Ptr = 0
Cur = 0
Adr = 0
Adr2 = 0
Val = 0
C = 0
led = machine.Pin(25, machine.Pin.OUT)
adc = temp = machine.ADC(4)
pwm = PWM(Pin(17))
pwm.freq(600000)
def playTone(tone, tempo):
   h = 0
   w = 0
   if tone == 97:
      h = 466 / 32
      w = int(1000000 / 466)
   elif tone == 98:
      h = 493 / 32
      w = int(1000000 / 493)
   elif tone == 99:
      h = 523 / 32
      w = int(1000000 / 523)
   elif tone == 100:
      h = 554 / 32
      w = int(1000000 / 554)
   elif tone == 101:
      h = 587 / 32
      w = int(1000000 / 587)
   elif tone == 102:
      h = 622 / 32
      w = int(1000000 / 622)
   elif tone == 103:
      h = 659 / 32
      w = int(1000000 / 659)
   elif tone == 104:
      h = 698 / 32
      w = int(1000000 / 698)
   elif tone == 105:
      h = 739 / 32
      w = int(1000000 / 739)
   elif tone == 106:
      h = 783 / 32
      w = int(1000000 / 783)
   elif tone == 107:
      h = 830 / 32
      w = int(1000000 / 830)
   elif tone == 108:
      h = 880 / 32
      w = int(1000000 / 880)
   else:
      print(tone)
      h = 466 / 32
      w = int(1000000 / 466)
   while tempo > 0:
      tempo = tempo - 1
      if tone == 'q':
         utime.sleep_us(500000)
      else:
         for i in range(int(h)):
            pwm.duty_u16(30000)
            utime.sleep_us(w)
            pwm.duty_u16(0)
            utime.sleep_us(w)
def doremi(d):
   global Ptr
   while READB(Ptr) != d:
      playTone(READB(Ptr), 6)
      put(READB(Ptr))
      Ptr = Ptr + 1
def crlf():
   print()
def put(b):
   print(b, end = " ")
def putchar(b):
   c = chr(b)
   print(c, end = "")
def putl(pt, d):
   while READB(pt) != d:
      putchar(READB(pt))
      pt = pt + 1
   return pt
def putlp(d):
   global Ptr
   while READB(Ptr) != d:
      putchar(READB(Ptr))
      Ptr = Ptr + 1
def nxtln(pt):
   while READB(pt) != ord('\0'):
      pt = pt + 1
   pt = pt + 1
   return pt
def fndln():
   global Bnd, PC, Cur
   Cur = 0
   while Cur != READB(Bnd):
      if READB(Cur) == READB(PC):
         return True
      Cur = nxtln(Cur)
   return False
def fndln2():
   global Bnd, PC, Cur
   Cur = 0
   while Cur != READB(Bnd):
      if READB(Cur) > READB(PC):
         return True
      Cur = nxtln(Cur)
   return False
def WRITEB(adr, data):
   global Ram
   Ram[adr] = data
def READB(adr):
   global Ram
   v = Ram[adr]
   return v
def num():
   global Ptr
   if (48 <= READB(Ptr)) and (READB(Ptr) <= 57):
      return True
   else:
      return False
def getnm():
   global Ptr, Val
   if not(num()):
      return False
   n = 0
   while (num()):
      n *= 10
      ch = READB(Ptr)
      Ptr = Ptr + 1
      n += (ch - 48)
   Val = n
   return True
def getvr():# hidari
   global Ptr, Adr, PC, C
   C = READB(Ptr)
   if C == ord('a'):
      Adr = 230
   elif C == ord('#'):
      Adr = PC
   elif C == ord('b'):
      Adr = 231
   elif C == ord('c'):
      Adr = 232
   else:
      Adr = 230
def getvr2():
   global Ptr, Adr2, PC
   cc = READB(Ptr)
   if cc == ord('a'):
      Adr2 = 230
   elif cc == ord('#'):
      Adr2 = PC
   elif cc == ord('b'):
      Adr2 = 231
   elif cc == ord('c'):
      Adr2 = 232
   else:
      Adr2 = 230
def term():
   global Ptr, Val
   cc = READB(Ptr)
   val2 = Val
   Ptr = Ptr + 1
   factr()
   if cc == ord('*'):
      Val = val2 * Val
   elif cc == ord('+'):
      Val = val2 + Val
   elif cc == ord('-'):
      Val = val2 - Val
   elif cc == ord('/'):
      Val = val2 / Val
   elif cc == ord('%'):
      Val = val2 % Val
   elif cc == ord('='):
      if (val2 == Val):
         Val = 1
      else:
         Val = 0
   elif cc == ord('>'):
      if (val2 >= Val):
         Val = 1
      else:
         Val = 0
   else:
      if (val2 < Val):
         Val = 1
      else:
         Val = 0
def factr():# migi
   global Ptr, Val, Adr2
   if READB(Ptr) == ord('\0'):
      Val = 0
      return
   if getnm():
      return
   cc = READB(Ptr)
   if cc == ord('$'):# rnd
      r = random.random()
      Val = int(r * 10)
      Ptr = Ptr + 1
   elif cc == ord('?'):# input
      Val = int(input("?"))
      Ptr = Ptr + 1
   elif cc == ord('h'):# H
      tm = utime.localtime()
      Val = tm[3]
      Ptr = Ptr + 1
   elif cc == ord('m'):# m
      tm = utime.localtime()
      Val = tm[4]
      Ptr = Ptr + 1
   elif cc == ord('s'):# s
      tm = utime.localtime()
      Val = tm[5]
      Ptr = Ptr + 1
   elif cc == ord('l'):# adc
      v = adc.read_u16()
      v = v >> 7
      Val = v & 0xff
      Ptr = Ptr + 1
   else:
      getvr2()
      Val = READB(Adr2)
      Ptr = Ptr + 1
def expr():# migi
   global Ptr
   factr()# getval
   cc = READB(Ptr)
   while cc != ord('\0'):
      term()# enzan
      cc = READB(Ptr)
   Ptr = Ptr + 1
def ordr():# siki hyouka
   global Ptr, Val, C, Adr
   getvr()# hidari
   Ptr = Ptr + 2
   if READB(Ptr) == ord('"'):# print("")
      Ptr = Ptr + 1
      putlp(ord('"'))
   elif READB(Ptr) == ord("'"):# doremi
      Ptr = Ptr + 1
      doremi(ord("'"))
   elif READB(Ptr) == ord('!'):# crlf
      print()
   else:
      expr()# migi
      if C == ord('?'):
         put(Val)# print
      elif C == ord('l'):# led
         led.value(Val)
      elif C == ord('"'):# sleep
         time.sleep(Val)
      else:
         WRITEB(Adr, Val)# dainyuu
def run():
   global Bnd, Ptr, Lbf, Cur, PC, Ram
   for i in range(276):
      Ram.append(0)
   WRITEB(Bnd, 0)
   print("oregengo v1.5")
   while True:
      str = input("\n>")
      Ptr = Lbf
      for j in str:
         WRITEB(Ptr, ord(j))
         Ptr = Ptr + 1
      WRITEB(Ptr, ord('\0'))
      ima = 0
      Ptr = Lbf
      if not(getnm()):# dairect
         while True:
            ima = READB(PC)
            #print(ima)
            ordr()# siki hyouka
            if READB(PC) == 0 and ima == 0:
               break
            else:
               if READB(PC) == 0:
                  WRITEB(PC, ima)
               if READB(PC) == 1:
                  ima = 1
               if READB(PC) == 300:
                  sys.exit()
               if READB(PC) == ima:
                  if fndln2():
                     WRITEB(PC, READB(Cur))
                     Ptr = Cur + 2
                  else:
                     break
               else:
                  if fndln():
                     WRITEB(PC, READB(Cur))
                     Ptr = Cur + 2
                  else:
                     break
      else:
         if Val == 0:
            #print("#list")
            pt = 0
            while pt < READB(Bnd):
               put(READB(pt))
               pt = pt + 1
               pt = putl(pt, ord('\0'))
               crlf()
               pt = pt + 1
         else:# del insert append
            f = 0
            WRITEB(PC, Val)
            if fndln():
               #print("#del")
               src = nxtln(Cur)
               dst = Cur
               while src != READB(Bnd):
                  WRITEB(dst, READB(src))
                  dst = dst + 1
                  src = src + 1
               WRITEB(Bnd, dst)
            if fndln2():
               f = 1
            src = READB(Bnd)
            m = 2
            h = Ptr
            while READB(h) != ord('\0'):
               m = m + 1
               h = h + 1
            if m > 2:
               WRITEB(Bnd, (src + m))
               if f == 1:
                  #print("#insert")
                  dst = READB(Bnd)
                  while src != Cur:
                     WRITEB(dst, READB(src))
                     dst = dst - 1
                     src = src - 1
                  WRITEB(dst, READB(src))
                  src = Cur
               WRITEB(src, Val)
               #print("#append")
               src = src + 1
               for k in range(m - 1):
                  WRITEB(src, READB(Ptr))
                  Ptr = Ptr + 1
                  src = src + 1



以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?