Shop OBEX P1 Docs P2 Docs Learn Events
Huge messageboard — Parallax Forums

Huge messageboard

TumblerTumbler Posts: 323
edited 2014-05-17 12:39 in Robotics
Making progress here (regarding this post: http://forums.parallax.com/showthread.php/144990-Large-messageboard)

My local soccerteam needs a large messageboard (for score and massaging stuff)

Since this has to be viewed at a large distance, the board will be at least 5m wide (70cm high)
So i start this project with 12 (or maybe 10) displays (each display consists 16 ledstrips, like a 16 digit display)

Uploaded some pics here:

This has to be the final product. ( i like photo editing software :smile: )
future.jpg


And from a distance...
future2.jpg


My first 2 displays, 10 to go ....
(almost 2 meters wide, 60 cm high) Tv is a 27 inch one)

P3143827.jpg
P3143828.jpg


wired the ledstrips...
P3143829.jpg


And the drivers, need 3 of them.
P3143830.jpg
P3143831.jpg
P3143834.jpg


some test with my first design...
P3143836.jpg


And of course, it will be controlled by a propeller.

Video is coming up later...
797 x 558 - 73K
802 x 590 - 56K
800 x 600 - 140K
800 x 600 - 119K
800 x 600 - 118K
800 x 600 - 133K
800 x 600 - 108K
800 x 600 - 142K
800 x 600 - 91K
800 x 600 - 126K
«1

Comments

  • TumblerTumbler Posts: 323
    edited 2013-03-14 04:33
  • TtailspinTtailspin Posts: 1,326
    edited 2013-03-14 07:13
    That looks like it will be very easy to read from a distance,
    Maybe you could use a black background to make the LEDs really shine?

    -Tommy
  • Martin HodgeMartin Hodge Posts: 1,246
    edited 2013-03-14 12:35
    That's going to be a sweet display!
  • JLockeJLocke Posts: 354
    edited 2013-03-14 17:02
    Very nice! I hope you'll post full project details here when it's completed (looks like you're almost there!).
    I used to help out a friend at a sign shop, and learned a good rule of thumb for character height is 1" of letter height for every 10 feet of distance it's to be read. So I guess that's 2.54 cm in height for every 3 meters in viewing distance. This is looking very good!
  • TumblerTumbler Posts: 323
    edited 2013-03-16 02:17
    looks like you're almost there

    Hmmm, i'm not :blank:
    Finished my first panel, http://www.youtube.com/watch?v=g0ntRBnoI2I&list=UUWYbKz2Sm27cdXqD5b6HEUA

    and i need 6 of them.

    And here is the driver pcb, can drive 4 displays (4 letters)
    4 layer pcb
    pcb.jpg


    Almost finished my second panel, just need to connect it to the driver pcb and make a small program for the propeller.

    Will upload a movie later this day
    804 x 440 - 102K
    pcb.jpg 102.4K
  • TumblerTumbler Posts: 323
    edited 2013-03-16 11:18
    As promised
  • Mark_TMark_T Posts: 1,981
    edited 2013-03-17 18:36
    Very nice! Have you tried viewing in daylight?
  • TumblerTumbler Posts: 323
    edited 2013-03-20 21:31
    Yes i have. The leds are bright enough.
    Just have to test it in direct sun light.
  • Ken GraceyKen Gracey Posts: 7,387
    edited 2013-03-20 21:45
    Hey Tumbler,

    I really like your your sign project. It'll have tremendous visibility, a useful purpose, and represents a great connection between community and technologists. I'm inspired to build something again.

    Here's a different implementation of a neon sign project I built about ten years ago. Jon McPhalen provided the BS2p24 code.

    http://www.parallax.com/tabid/336/default.aspx

    And a video:

    I'll continue to read this thread regularly.

    Ken Gracey
  • TumblerTumbler Posts: 323
    edited 2013-03-21 12:40
    Thx Ken,


    I didn't thought about some animation after seeing your movie.
    So i did some tests and uploaded a new movie.


    I like the 'carrousel' sub and the 'independence day' test


    The 'that's why...' text is coming from a sd card.


    I hope to finish the next 4 displays this weekend.
    Today i contacted some guy who is making a waterproof housing for these displays.


    video:


    And this is the code i'm using now for testing.
    CON   _clkmode = xtal1 + pll16x
      _xinfreq = 5_000_000
    
    
    
    
    CON
    
    
    
    
    'Shiftregisters
      CLOCK           = 0            ' CLOCK pin number of CLK  pin on chip (AKA SCK)
      DATAIN          = 2            ' DATAIN pin number of SER   pin on chip
      LATCH           = 1            ' LATCH pin number of RCK  pin on chip
    
    
    
    
    ' SD Card
      DO              = 20      'Set these pins to match your SD connections.
      CLK             = 21
      DI              = 22
      CS              = 23
    
    
    
    
    'Xbee
      XBT   =  10  'DIN                                                  
      XBR   =  11  'DOUT
    
    
    
    
    
    
    
    
    OBJ
      pst   : "Parallax Serial Terminal"
      sdfat : "fsrw"
      xbee      : "xbee_object_2"
    
    
    
    
       
    VAR
      long  letter,bitout,databyte
      byte id
      long LETTERS[95]
      byte inbuf[100]
      byte inMB[100] 
    
    
    
    
    CON   
        
     
        A1=  %1<<0             
        A2=  %1<<1
        B=   %1<<2
        C=   %1<<3
        D1=   %1<<4
        D2=  %1<<5
        E=  %1<<6
        F=   %1<<7
        G1=  %1<<8
        G2=  %1<<9
        H=   %1<<10
        I=   %1<<11
        J=   %1<<12
        K=   %1<<13
        L=   %1<<14
        M=   %1<<15
    
    
    
    
       
          
        
    PUB Main | idx,r  
      'special
    
    
    
    
      LETTERS[32] := 0                      ' space
      LETTERS[33] := 0                      ' !
      LETTERS[34] := F+H                    ' "
      LETTERS[35] := 0                      ' #
      LETTERS[36] := 0                      ' $
      LETTERS[37] := A1+H+G1+F+G2+C+D2+I+K+L' %
      LETTERS[38] := A1+A2+J+K+I+D1+D2      ' &  glass  
      LETTERS[39] := F                      ' '
      LETTERS[40] := H+G1+G2+L+M            ' (  little man arms down
      LETTERS[41] := H+J+K+L+M              ' )  little man arms up
      LETTERS[42] := G1+G2+I+L+H+J+M+K      ' *
      LETTERS[43] := G1+G2+H+I              ' +
      LETTERS[44] := L                      ' ,
      LETTERS[45] := G1+G2                  ' -
      LETTERS[46] := D1                     ' .
      LETTERS[47] := L+K                    ' /
    'numbers
      LETTERS[48] :=  A1+A2+B+C+D1+D2+E+F+K+L   '0
      LETTERS[49] :=  A1+H+I+D1+D2              '1
      LETTERS[50] :=  A1+A2+B+D1+D2+E+G1+G2     '2
      LETTERS[51] :=  A1+A2+B+C+D1+D2+G1+G2     '3
      LETTERS[52] :=  B+C+F+G1+G2               '4
      LETTERS[53] :=  A1+A2+C+D1+D2+F+G1+G2     '5
      LETTERS[54] :=  A1+A2+C+D1+D2+E+F+G1+G2   '6
      LETTERS[55] :=  A1+A2+K+I                 '7
      LETTERS[56] :=  A1+A2+B+C+D1+D2+E+F+G1+G2 '8
      LETTERS[57] :=  A1+A2+B+C+D1+D2+F+G1+G2   '9
    
    
    
    
    'special
      LETTERS[58] := A1+D1                    ':
      LETTERS[59] := A1+L                     ';
      LETTERS[60] := K+M+B+C                  '<
      LETTERS[61] := G1+G2+D1+D2              '=
      LETTERS[62] := J+L+F+E                  '>
      LETTERS[63] := 0                        '?
    
    
    
    
    'alphabet 
      LETTERS[64] := 0                      '@
      LETTERS[65] := A1+A2+B+C+E+F+G1+G2    'A
      LETTERS[66] := A1+A2+B+C+D1+D2+G2+H+I 'B
      LETTERS[67] := A1+A2+D1+D2+E+F        'C
      LETTERS[68] := A1+A2+B+C+D1+D2+H+I    'D
      LETTERS[69] := A1+A2+D1+D2+E+F+G1     'E
      LETTERS[70] := A1+A2+E+F+G1           'F
      LETTERS[71] := A1+A2+C+D1+D2+E+F+G2   'G
      LETTERS[72] := B+C+E+F+G1+G2          'H
      LETTERS[73] := A1+A2+H+I+D1+D2        'I
      LETTERS[74] := B+C+D1+D2              'J
      LETTERS[75] := E+F+G1+K+M             'K
      LETTERS[76] := D1+D2+E+F              'L
      LETTERS[77] := B+C+E+F+J+K            'M
      LETTERS[78] := B+C+E+F+J+M            'N
      LETTERS[79] := A1+A2+B+C+D1+D2+E+F    'O
      LETTERS[80] := A1+A2+B+E+F+G1+G2      'P
      LETTERS[81] := A1+A2+B+C+D1+D2+E+F+M  'Q
      LETTERS[82] := A1+A2+B+E+F+G1+G2+M    'R
      LETTERS[83] := A1+A2+C+D1+D2+F+G1+G2  'S
      LETTERS[84] := A1+A2+H+I              'T
      LETTERS[85] := B+C+D1+D2+E+F          'U
      LETTERS[86] := E+F+L+K                'V
      LETTERS[87] := B+C+E+F+L+M            'W
      LETTERS[88] := J+K+L+M                'X
      LETTERS[89] := J+K+I                  'Y
      LETTERS[90] := A1+A2+D1+D2+K+L        'Z
    
    
    
    
      LETTERS[91] := A1+F+E+D1              '[ 
      LETTERS[92] := J+M                    '\ 
      LETTERS[93] := A2+B+C+D2              '] 
      LETTERS[94] := K+B                    '^ 
      LETTERS[95] := D1+D2                  '_ 
     
      
     
      'start terminal
      pst.Start(115_200)
      xbee.start(XBR, XBT, %0000, 9_600)                            ' start XBee coms 9600 baud
      pause
      xbee.tx("O")                                                  
      xbee.tx("K")                                                  ' indicate ready
    
    
    
    
       
      Init
    
    
    
    
      xbee.rxflush                                                  ' clear trash from xbee
      
    {{  repeat
        getstring(string(13),@inbuf)
        'pst.str(string("this is what is in the buffer: "))
        'pst.str(@inbuf)
        'pst.str(13)
    
    
    
    
    
    
    
    
        'check for predefined commands
        if inbuf[0] == "@"
          if inbuf[1]== "1"
            carrousel(5)
          if inbuf[1]=="2"
            flash(5)
          if inbuf[1]=="5"
            SDCard
        'else show textfield
    
    
    
    
        elseif inbuf[0]=="!"
          idx := inbuf[1] 
          pst.dec(idx)
          pst.str(13)
          writeSer(idx)
    
    
    
    
        else
          repeat idx from 0 to strsize(@inbuf)-1
            pst.dec(inbuf[idx])
            pst.str(13)
            writeSer(LETTERS[inbuf[idx]])
            qpause
          bytemove(@inMB, @Inbuf, 100) 'Copy Buff1 to Buff2
          
     }}
    
    
    
    
      repeat
        writeLine(0,0,0,0)
        writeLine(A1+A2+H+I,B+C+G1+G2+E+F,J+K+L+M,0)    'thx
        pause
        writeLine(F+E+G1+K+M,A1+A2+F+G1+E+D1+D2,E+F+J+M+B+  C,0)  'ken
        pause
        writeLine(0,F+G1+G2+B+C,0,0)     '4
        pause
        writeLine(A1+A2+H+I,E+F+G1+G2+B+C,A1+A2+F+G1+E+D1+  D2,0)   'the
        pause
        writeLine(A1+A2+H+I,A1+A2+H+I+D1+D2,E+F+A1+A2+B+G2  +G1,0)  'tip
        pause
    
    
    
    
        SDCard        'read file from SD card
        'pause
        carrousel(5)  'show the carrousel 5 times
    
    
    
    
        'independence day test
        writeLine(0,0,0,G2)
        vqpause
        writeLine(0,0,0,G1)
        vqpause
        writeLine(0,0,G2,0)
        vqpause
        writeLine(0,G2,0,0)
        vqpause
        writeLine(0,G1,0,0)
        vqpause
        writeLine(G2,0,0,0)
        vqpause
        writeLine(J+K+L+M,0,0,0)   '*
        vqpause
        writeLine(A1+A2+H+I,0,0,0)  'T
        pause
        writeLine(A1+A2+H+I,0,0,G2)
        vqpause
        writeLine(A1+A2+H+I,0,0,G1)
        vqpause
        writeLine(A1+A2+H+I,0,G2,0)
        vqpause
        writeLine(A1+A2+H+I,0,G1,0)
        vqpause
        writeLine(A1+A2+H+I,G2,0,0)
        vqpause
        writeLine(A1+A2+H+I,G1,0,0)
        vqpause
        writeLine(A1+A2+H+I,J+K+L+M,0,0)  'T*
        vqpause
        writeLine(A1+A2+H+I,E+F+G1+G2+B+C,0,0)  'TH
        pause
        writeLine(A1+A2+H+I,E+F+G1+G2+B+C,0,G2)  
        vqpause
        writeLine(A1+A2+H+I,E+F+G1+G2+B+C,0,G1)  
        vqpause
        writeLine(A1+A2+H+I,E+F+G1+G2+B+C,G2,0) 
        vqpause
        writeLine(A1+A2+H+I,E+F+G1+G2+B+C,G1,0)  
        vqpause
        writeLine(A1+A2+H+I,E+F+G1+G2+B+C,J+K+L+M,0)  'TH*
        vqpause
        writeLine(A1+A2+H+I,E+F+G1+G2+B+C,J+K+L+M,0)  'THX
        pause
        writeLine(0,0,0,0)
        pause
        pause    
    
    
    
    
     
    PUB SDCard | mount ,r
    
    
    
    
      writeLine(0,0,0,0)
      ' mount sd card
      mount := \sdfat.mount_explicit(DO, CLK, DI, CS)
      if mount < 0
        pst.str( string( 13, "Failed to mount", 13 ) )
        abort
      pst.str(string(13,"SD was card found and mounted fine.",13))
      
      sdfat.popen(string("data.txt"),"r")
       
      repeat                    'Start a repeat loop
        r := sdfat.pgetc        'Get a character from data.txt
        letter := r
        'pst.dec(r)
          if r < 0              'If the character is "less than zero"
             pst.newline        '  send a newline to the terminal
             
             quit               '  and quit.
          if r > 10             'If the character is "greater than 10"
             pst.char(r)         '  send the character to the screen. 
             WriteSer(LETTERS[letter])    'and write it to the modules    
             QPause
      pst.str(string("Closing file and unmounting SD card.",13))
       
      sdfat.pclose  
       
      'Unmount the card and end program.
      sdfat.unmount  
       
     
    
    
    
    
    
    
    
    
    PUB WriteSer(Data)
      Data ><= 16                     ' bitwise reverse the lsbs
      repeat 16                      ' shift out 8 bits
        outa[DATAIN] := Data         ' shift out next bit (bit0)  to serial pin (0 or 1)
        outa[CLOCK] ~~       ' toggle the clock pin to shift bit out
        outa[CLOCK] ~        ' high then low to cycle the clock
        Data >>= 1                       'next bit
      outa[LATCH]~~        ' toggle the RCK pin to latch the output
      outa[LATCH]~    
      'waitcnt(clkfreq + cnt)
    
    
    
    
    
    
    
    
    PUB WriteSerNoLatch(Data)  
      Data ><= 16                     ' bitwise reverse the lsbs
      repeat 16                      ' shift out 8 bits
        outa[DATAIN] := Data         ' shift out next bit (bit0)  to serial pin (0 or 1)
        outa[CLOCK] ~~       ' toggle the clock pin to shift bit out
        outa[CLOCK] ~        ' high then low to cycle the clock
        Data >>= 1                       'next bit
    
    
    
    
    PUB WriteLine(data1,data2,data3,data4)
       WriteSerNoLatch(data1)
       WriteSerNoLatch(data2)
       WriteSerNoLatch(data3)
       WriteSer(data4)
       
    PUB AllOff
        repeat id from 1 to 16 
          outa[DATAIN]:= 0
          outa[CLOCK] :=1       ' toggle the clock pin to shift bit out
          outa[CLOCK] :=0
          LatchIt
          
    
    
    
    
    PUB LatchIt
          outa[LATCH] := 1
          outa[LATCH] := 0 
    
    
    
    
    PUB Pause
      waitcnt(clkfreq + cnt)
    
    
    
    
    PUB QPause
      waitcnt(clkfreq/2 + cnt)
    
    
    
    
    PUB VQPause
      waitcnt(clkfreq/30 + cnt)
    
    
    
    
    PUB Init
      'set control line as ouputs
      dira[CLOCK] ~~
      dira[DATAIN] ~~
      dira[LATCH] ~~
    
    
    
    
    PUB getstring(endstr, buffer) | rxchar, ec, ce
      ce := 0
      repeat
        rxchar := xbee.rx
        ec := endstr
        'search term list for end char
        repeat while byte[ec] <> 0
          if byte[ec] == rxchar
            byte[buffer] := 0  'null terminate return str
            return byte [ec]   'return terminator
          else
            ec++
        if rxchar <> 10
          byte[buffer] := rxchar
        ce++
        if ce < 100
          buffer++
     
    PUB Carrousel (count)
      repeat count
        writeLine(A1,0,0,D2)
        VQpause
        writeLine(A2,0,0,D1)
        VQpause
        writeLine(0,A1,D2,0)
        VQpause
        writeLine(0,A2,D1,0)
        VQpause
        writeLine(0,D2,A1,0)
        VQpause
        writeLine(0,D1,A2,0)
        VQpause
        writeLine(D2,0,0,A1)
        VQpause
        writeLine(D1,0,0,A2)
        VQpause
        writeLine(E,0,0,B)
        VQpause
        writeLine(F,0,0,C)
        VQpause
        writeLine(A1,0,0,D2)
        VQpause
        writeLine(A2,0,0,D1)
        VQpause
        writeLine(0,A1,D2,0)
        VQpause
        writeLine(0,A2,D1,0)
        VQpause
        writeLine(0,D2,A1,0)
        VQpause
        writeLine(0,D1,A2,0)
        VQpause
        writeLine(D2,0,0,A1)
        VQpause
        writeLine(D1,0,0,A2)
        VQpause
        writeLine(E,0,0,B)
        VQpause
        writeLine(F,0,0,C)
        VQpause
    
    
    
    
    PUB Flash(count) | idx
      repeat count
        writeLine(0,0,0,0)
        qpause
        repeat idx from 0 to 3
            writeSer(LETTERS[inMB[idx]])
        qpause
    
    
    
    
    


    Added the xbee lib for future use, i'm working on a visual basic project to control this board.


    screenshot:
    screenshot.jpg
    1024 x 576 - 49K
  • TumblerTumbler Posts: 323
    edited 2013-06-15 11:15
    **UPDATE**


    Almost completed the frames for the panels.

    Blank panel:
    frame1.jpg
    frame2.jpg


    Front:
    frame3.jpg
    frame4.jpg


    Back:
    frame5.jpg


    Placed horizontally (4m wide)
    frame6.jpg


    and vertically (1,2 m high)
    frame7.jpg


    And painted
    frame8.jpg
    frame9.jpg


    More to come (soon i hope)...
    800 x 600 - 95K
    800 x 600 - 93K
    800 x 600 - 116K
    800 x 600 - 131K
    800 x 600 - 130K
    800 x 600 - 120K
    800 x 600 - 140K
    800 x 600 - 128K
    800 x 600 - 126K
  • eod_punkeod_punk Posts: 146
    edited 2013-06-16 07:31
    Very nice Tumbler. I can't wait to see what next.
  • Duane DegnDuane Degn Posts: 10,588
    edited 2013-06-16 11:10
    Cool project Tumbler. I'm a fan of LEDs myself.

    Can you control the brightness of the display?

    I doubt you need to control the the brightness of the individual segments (though I don't think it would be too hard to do so) but I'd think controlling the overall brightness would be useful.

    It looks like you've tied the enable pin low on your PCB. I did the same with my recent LED project and in hindsight I wish I had routed the enable pins to the input header.

    I'm pretty sure one could control the brightness of a display using TPIC6B595 chips by pulsing the enable pin (by "enable" I mean pin 9 "/G" on the datasheet).

    Do you have specs on those LED strips you're using? They're pretty darn bright. What's the spacing between LEDs?

    Thanks for sharing your project. It's fun to watch your sign in action.
  • TumblerTumbler Posts: 323
    edited 2013-06-16 11:55
    Mason, i hope very soon :)

    Duane, i can't control the brightness anymore, since i have grounded the enable pin of the tpics. :frown: (seems i made the same mistake as you)

    Ledstrip specs (sorry, it's in dutch) : http://www.ledstripxl.nl/product-informatie/5-meter-LED-Strip-Los-IP65/LED01WS/LED-Strip-Waterproof-60*LED-5meter-Koud-Wit-Los.html
  • Cluso99Cluso99 Posts: 18,069
    edited 2013-06-16 14:38
    Tumbler: Nice project, WTG :)
    Tip for next time.. put a slope on your display. I am not sure of the angle - perhaps an old datasheet of a 16segment display will have the typical slope angle used, or you can measure one.
  • Ken GraceyKen Gracey Posts: 7,387
    edited 2013-06-17 21:35
    Just got to watch the reply video, Tumbler. You're welcome for the tip, and the animation looks great BTW. I think I might have to build one of these in the future myself.
  • TumblerTumbler Posts: 323
    edited 2013-07-02 00:57
    First panel finished.
    itsHuge.jpg

    added a plexiplate front.
    As you can see, this panel is huge! :) Plz only take a look at the panel, not me :)
    I think I might have to build one of these in the future myself.

    Since this is a project, i will post howto instructions later when i finished this one

    And like Wall-e used to say: Tadaaaaah
    tadaaah.jpg
    663 x 884 - 143K
    492 x 656 - 83K
  • Chris SavageChris Savage Parallax Engineering Posts: 14,406
    edited 2013-07-02 10:02
    Very nice! Good work, Tumbler!
  • TumblerTumbler Posts: 323
    edited 2013-07-07 12:50
    Update...

    Finished the second panel this weekend.

    Wiring the drivers....
    026.jpg

    027.jpg

    028.jpg


    And a video:
    461 x 614 - 102K
    461 x 614 - 103K
    461 x 614 - 120K
    026.jpg 102.1K
    027.jpg 102.7K
    028.jpg 120.3K
  • Mark_TMark_T Posts: 1,981
    edited 2013-07-10 06:54
    They look great - you said 6 panels so you'll be busy for a while longer I think!
  • HarbingerHarbinger Posts: 7
    edited 2013-07-14 15:31
    Nice project. I think the school will be happy with the result. Congrats well done!
  • WhitWhit Posts: 4,191
    edited 2013-07-18 16:54
    Fantastic project Tumbler! I shared this with a friend who is really into lighting and animation.
  • TumblerTumbler Posts: 323
    edited 2013-07-18 21:41
    Finished!

    To reduce costs, we decide to use only 2 (2x4 -16 segment) displays.
    The boxes looks like this:

    finished.jpg


    Now comes the fun stuff, programming.
    More later...
    1024 x 768 - 110K
  • TumblerTumbler Posts: 323
    edited 2014-04-05 08:50
    Update...

    My first android app, connected via bleutooth (rn42) and my board...
    i like this one :)
    https://www.youtube.com/watch?v=83GmuRSBIKg&feature=youtu.be
  • kwinnkwinn Posts: 8,697
    edited 2014-04-06 15:29
    Very nice project. Congratulations.
  • TumblerTumbler Posts: 323
    edited 2014-04-06 19:05
    Here is a better movie.
  • PropGuy2PropGuy2 Posts: 358
    edited 2014-04-10 15:32
    Very nice! I have been working on a large format display also, except it uses electro-color type paint. That is the paint / pigment color changes with an electric charge. So it can be seen in any lighting condition - dark to bright sunlight - using little power.since only the color is changed and not the intensity (as a light bulb or LED) BTW - It is not LCD, or e-ink or anything like that.
  • mrmamrma Posts: 28
    edited 2014-04-22 11:02
    Good Job. Congratulations!
  • TumblerTumbler Posts: 323
    edited 2014-05-17 12:04
    Finished project.

    Boards willed be picked up in 2 weeks.
    Finished software today. A test can be seen here:
    Data1 to Data5 are textfiles, stored on a sd card.
    There is a special effect between each data file.

    Pictures or movie will be added here when boards are placed.
  • xanaduxanadu Posts: 3,347
    edited 2014-05-17 12:20
    Very nice, would love to see it in its new home too.
Sign In or Register to comment.